求解释一下python中bytearray和memoryview 的使用 以及适用的场景
PHPz
PHPz 2017-04-18 10:00:13
0
1
600

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:]

PHPz
PHPz

学习是最好的投资!

全員に返信(1)
小葫芦

つい最近、memoryview を使用してこの質問に答えました。

Bytearray は、Python2 の str に相対する可変バイト シーケンスですが、str は不変です。
Python3 では、str はデフォルトで Unicode エンコーディングであるため、bytearray を介したバイト単位でのみアクセスできます。

Memoryview は、バッファ プロトコル [1,2] をサポートするオブジェクトに対してバイト単位のメモリ アクセス インターフェイスを提供します。利点は、メモリ コピーがないことです。
デフォルトの str および bytearray はバッファー プロトコルをサポートします。
次の 2 つの動作の比較:
簡単に言うと、str と bytearray のスライス操作では、新しいスライス str と bytearray が生成され、データがコピーされますが、memoryview を使用した後はこのようなことは起こりません。

  1. メモリビューを使用しないでください

    リーリー
  2. メモリビューを使用する

    リーリー

私の使用シナリオは、ネットワーク プログラムでのソケット受信とデータ分析です:

  1. memoryview を使用する前のソケット受信コードは次のように簡略化されます

    def read(size):

    リーリー
  2. meoryview を使用すると、文字列の定数の結合と新しいオブジェクトの生成が回避されます

    リーリー

    アンパック解析に struct を使用する場合、memoryview オブジェクトを直接受け取ることができ、非常に効率的です (セグメント内の大きな str を解析するときに大量のスライス操作を回避できます)。

例:

リーリー

[1] https://jakevdp.github.io/blo...
[2] http://legacy.python.org/dev/...

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート