2016-03-08 12 views
5

変更可能なbytearrayタイプから変更不可能なbytesタイプへの変換にコピーが必要ですか?それに関連するコストはありますか?または、インタプリタは、char*をC++のconst char* constにキャストするなど、不変バイトシーケンスとして扱いますか?bytearrayからバイトへの変換にはコピーが必要ですか?

ba = bytearray() 
ba.extend("some big long string".encode('utf-8')) 

# Is this conversion free or expensive? 
write_bytes(bytes(ba)) 

これはbytesbytesstrのためだけの別名である、独自のタイプとPython 2.7でPythonの3の間で異なっていますか?

+0

すべての操作には*いくらかのコストがかかります。ソースを見ることもできますし、タイミングテストを使用して、問題のサイズに応じて時間が直線的に増加するかどうかを確認することもできます(コピーが作成された場合のように)。 –

+0

'bytearray'を' bytes'に変換するとコピーが発生すると私は確信しています。これは、新しい 'bytes'が' bytearray'と同じバッキング配列を指している場合、本当に不変ではないからです。 – Nayuki

+1

コピーを作成せずに 'bytearray'の内容を表示したい場合は、その目的のために' memoryview'を使用することができます。注意しなければならないのは、 'bytearray'データを変更すると' memoryview'のデータが変更され、 'bytearray'はサイズ変更できません(append's、' pop's、スライス割り当てのサイズ変更などはありません)。エクスポートされたバッファ(そのうちの 'memoryview'がPythonレベルコードで作成された最も一般的な型です)が存在する限りです。 – ShadowRanger

答えて

11

新しいコピーが作成されると、バッファは、Python 2のいずれかで、bytesarrayと新しいbytesオブジェクト間で共有されていないか、bytesarrayオブジェクトがまだ参照することができたとして3

あなたは、それを共有することができませんでした値を変更してください。

bytesobject.c source codeを参照してください。buffer protocolは、データのストレートアップコピーを作成するために使用されます(PyBuffer_ToContiguous()経由)。

7

Martjinが正しいです。私はちょうどその答えをcpythonソースに戻したいと思っていました。

bytes_new最初の新しいバイトオブジェクトを作成し、PyBuffer_ToContiguousを呼び出し_PyBytes_FromBufferを呼び出すなる、PyBytes_FromObjectを呼び出すであろう、と呼ばれ、バイトhereのソースを見ると(hereを定義します)。これはメモリコピー機能であるbuffer_to_contiguousを呼び出します。関数のコメントは次のようになります。

srcを連続した表現にコピーします。 orderは 'C'、 'F'(Fortran)または 'A'(Any)のいずれかです。前提:srcはPyBUF_FULL情報を持ち、src-> ndim> = 1、len(mem)== src-> lenです。

したがって、bytearray引き数を持つバイトを呼び出すと、データがコピーされます。

関連する問題