変更可能な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))
これはbytes
がbytes
がstr
のためだけの別名である、独自のタイプとPython 2.7でPythonの3の間で異なっていますか?
すべての操作には*いくらかのコストがかかります。ソースを見ることもできますし、タイミングテストを使用して、問題のサイズに応じて時間が直線的に増加するかどうかを確認することもできます(コピーが作成された場合のように)。 –
'bytearray'を' bytes'に変換するとコピーが発生すると私は確信しています。これは、新しい 'bytes'が' bytearray'と同じバッキング配列を指している場合、本当に不変ではないからです。 – Nayuki
コピーを作成せずに 'bytearray'の内容を表示したい場合は、その目的のために' memoryview'を使用することができます。注意しなければならないのは、 'bytearray'データを変更すると' memoryview'のデータが変更され、 'bytearray'はサイズ変更できません(append's、' pop's、スライス割り当てのサイズ変更などはありません)。エクスポートされたバッファ(そのうちの 'memoryview'がPythonレベルコードで作成された最も一般的な型です)が存在する限りです。 – ShadowRanger