x = bytearray(b'abcde')y = memoryview(x)y[1:3] = b'yz'x[1:3] = b'ab'y[3] = ord(b'e')x[3] = ord(b'f')
x = bytearray(b'abcde')while len(x)>0: x = x[1:]
x = bytearray(b'abcde')y = memoryview(x)while len(y)>0: y = y[1:]
学习是最好的投资!
つい最近、memoryview を使用してこの質問に答えました。
Bytearray は、Python2 の str に相対する可変バイト シーケンスですが、str は不変です。 Python3 では、str はデフォルトで Unicode エンコーディングであるため、bytearray を介したバイト単位でのみアクセスできます。
Memoryview は、バッファ プロトコル [1,2] をサポートするオブジェクトに対してバイト単位のメモリ アクセス インターフェイスを提供します。利点は、メモリ コピーがないことです。 デフォルトの str および bytearray はバッファー プロトコルをサポートします。 次の 2 つの動作の比較: 簡単に言うと、str と bytearray のスライス操作では、新しいスライス str と bytearray が生成され、データがコピーされますが、memoryview を使用した後はこのようなことは起こりません。
メモリビューを使用しないでください
メモリビューを使用する
私の使用シナリオは、ネットワーク プログラムでのソケット受信とデータ分析です:
memoryview を使用する前のソケット受信コードは次のように簡略化されます
def read(size):
meoryview を使用すると、文字列の定数の結合と新しいオブジェクトの生成が回避されます
アンパック解析に struct を使用する場合、memoryview オブジェクトを直接受け取ることができ、非常に効率的です (セグメント内の大きな str を解析するときに大量のスライス操作を回避できます)。
例:
[1] https://jakevdp.github.io/blo...[2] http://legacy.python.org/dev/...
つい最近、memoryview を使用してこの質問に答えました。
Bytearray は、Python2 の str に相対する可変バイト シーケンスですが、str は不変です。
Python3 では、str はデフォルトで Unicode エンコーディングであるため、bytearray を介したバイト単位でのみアクセスできます。
Memoryview は、バッファ プロトコル [1,2] をサポートするオブジェクトに対してバイト単位のメモリ アクセス インターフェイスを提供します。利点は、メモリ コピーがないことです。
デフォルトの str および bytearray はバッファー プロトコルをサポートします。
次の 2 つの動作の比較:
簡単に言うと、str と bytearray のスライス操作では、新しいスライス str と bytearray が生成され、データがコピーされますが、memoryview を使用した後はこのようなことは起こりません。
メモリビューを使用しないでください
リーリーメモリビューを使用する
リーリー私の使用シナリオは、ネットワーク プログラムでのソケット受信とデータ分析です:
memoryview を使用する前のソケット受信コードは次のように簡略化されます
def read(size):
リーリーmeoryview を使用すると、文字列の定数の結合と新しいオブジェクトの生成が回避されます
リーリーアンパック解析に struct を使用する場合、memoryview オブジェクトを直接受け取ることができ、非常に効率的です (セグメント内の大きな str を解析するときに大量のスライス操作を回避できます)。
例:
リーリー[1] https://jakevdp.github.io/blo...
[2] http://legacy.python.org/dev/...