2

Python bytearray が (整数が渡されて) 作成されると、そのバイト数の bytearray が作成され、すべてゼロに設定されます。

bytearray をクリアしたいのですが、かなり大きくなる可能性があり、それを反復して内容をゼロに設定するのはかなり貧弱です。

より良い方法はありますか?

(memoryviews と bytearrays は十分に文書化されていない IMO です)

これまでで最高のリソース (ただし、私の質問に答えてくれるものはありません)

http://docs.python.org/dev/library/stdtypes.html#bytes-methods

http://docs.python.org/dev/library/functions.html#bytearray

4

4 に答える 4

2

編集:この答えは間違っています。s = s.translate('\0'*256)は よりも遅いためs = bytearray(256)、ここで使用しても意味がありませんtranslate。@gnibbler はより良いソリューションを提供します。


バイト配列には、文字列と同じメソッドが多数あります。translate メソッドを使用できます。

In [64]: s = bytearray('Hello World')

In [65]: s
Out[65]: bytearray(b'Hello World')

In [66]: import string

In [67]: zero = string.maketrans(buffer(bytearray(range(256))),buffer(bytearray(256)))

In [68]: s.translate(zero)
Out[68]: bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')

ところで、Dave Beazley は非常に役立つbytearray の紹介を書いています。


または、ミリムースの答えをわずかに変更します。

In [72]: s.translate('\0'*256)
Out[72]: bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')

In [73]: %timeit s.translate('\0'*256)
1000000 loops, best of 3: 282 ns per loop

In [74]: %timeit s.translate(bytearray(256))
1000000 loops, best of 3: 398 ns per loop
于 2013-10-29T23:43:01.993 に答える
2

参照を変更せずに bytearray をクリアするいくつかの異なる方法を次に示します (他のオブジェクトが参照する場合)。

  1. clear() の使用:

    >>> a=bytearray(10)
    >>> a
    bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
    >>> a.clear()
    >>> a
    bytearray(b'')
    
  2. スライスの使用:

    >>> a=bytearray(10)
    >>> a[0:10] = []
    >>> a
    bytearray(b'')
    >>> a=bytearray(10)
    >>> del a[0:10]
    >>> a
    bytearray(b'')
    
  3. デルの使用:

    >>> a=bytearray(10)
    >>> b=a
    >>> del a[0:10]
    >>> a
    bytearray(b'')
    

b別の変数、たとえばが を参照している場合a、上記の手法のいずれもこれを壊さないことを確認できます。a新しい bytearray を作成してをリセットする次の手法は、これを破ります。

>>> a=bytearray(10)
>>> b=a
>>> b is a
True
>>> a=bytearray(10)
>>> b is a
False

ただし、上記のすべては配列サイズを 0 に変更します。おそらく、サイズを変更せずにすべての参照を有効に保ち、すべての項目を単純に 0 にしたい場合があります。

>>> a=bytearray(10)
>>> b=a
>>> b is a
True
>>> a[0:10]=bytearray(10)
>>> b is a
True

したがって、この手法を使用すると、配列の任意のサブセクション (実際には可変コンテナーの任意のサブセクション) を簡単に 0 にすることができます。

于 2013-10-30T04:57:21.663 に答える
0

あなたがする必要があるのは、バイト配列を再宣言することだけです

b = bytearray(LEN_OF_BYTE_ARRAY)
于 2013-10-29T23:43:01.390 に答える