27

array.array('B')とはどう違いbytearrayますか?

from array import array

a = array('B', 'abc')
b = bytearray('abc')

a[0] = 100
b[0] = 'd'

print a
print b

メモリや速度に違いはありますか? それぞれの好ましいユースケースは何ですか?

4

6 に答える 6

15

bytearrayPython 2.x のstring型の後継です。これは基本的に組み込みのバイト配列型です。元の型とは異なり、string可変です。

一方array、モジュールは、外部と通信するためのバイナリ データ構造を作成するために作成されました (たとえば、バイナリ ファイル形式の読み取り/書き込み)。

とは異なりbytearray、すべての種類の配列要素をサポートします。柔軟です。

したがって、バイト配列だけが必要な場合は、正常にbytearray動作するはずです。柔軟なフォーマットが必要な場合 (配列の要素の型を実行時に決定する必要がある場合など)array.arrayは、あなたの友人です。

bytearrayコードを見なくても、さまざまな要素の種類を考慮する必要がないため、おそらく高速であると思います。array('B')しかし、 を返す可能性がありますbytearray

于 2012-08-09T12:06:59.773 に答える
8

bytearrayすべての通常のstr方法があります。ミュータブルとして使用できstrます(Python3ではバイト)

array.arrayは、ファイルの読み取りと書き込みを対象としています。「B」は、array.arrayの特殊なケースです。

dir()それぞれを見るとかなりの違いがあることがわかります

>>> dir(bytearray)
['__add__', '__alloc__', '__class__', '__contains__', '__delattr__',
 '__delitem__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__',
 '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__',
 '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__',
 '__reduce__', '__reduce_ex__', '__repr__', '__rmul__', '__setattr__',
 '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append',
 'capitalize', 'center', 'count', 'decode', 'endswith', 'expandtabs', 'extend',
 'find', 'fromhex', 'index', 'insert', 'isalnum', 'isalpha', 'isdigit', 'islower',
 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans',
 'partition', 'pop', 'remove', 'replace', 'reverse', 'rfind', 'rindex', 'rjust',
 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip',
 'swapcase', 'title', 'translate', 'upper', 'zfill']
>>> dir(array)
['__add__', '__class__', '__contains__', '__copy__', '__deepcopy__',
 '__delattr__', '__delitem__', '__doc__', '__eq__', '__format__', '__ge__',
 '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', 
 '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__',
 '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmul__', '__setattr__',
 '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append',
 'buffer_info', 'byteswap', 'count', 'extend', 'frombytes', 'fromfile',
 'fromlist', 'fromstring', 'fromunicode', 'index', 'insert', 'itemsize', 'pop',
 'remove', 'reverse', 'tobytes', 'tofile', 'tolist', 'tostring', 'tounicode',
 'typecode']
于 2012-08-09T12:07:18.470 に答える
2

私のテストでは、どちらもほとんど同じサイズのメモリを使用していましたが、読み取りと書き込みのために大きなバッファを作成すると、bytearry の速度は配列の1.5 倍になりました。

from array import array
from time import time

s = time()

"""
map = array('B')
for i in xrange(256**4/8):
        map.append(0)
"""

#bytearray
map = bytearray()
for i in xrange(256**4/8):
        map.append(0)
print "init:", time() - s
于 2015-08-11T02:50:42.373 に答える
-2

array.arrayモジュールを自分で使用する必要はほとんどありません。struct通常、モジュールのように、バイナリ ファイル形式またはプロトコルのバイナリ データを作成するために使用されます。

bytearrayUnicode テキストに使用されるPython 3str()または Python 2とは対照的に、通常はエンコードされたテキスト (utf-8、ascii など) を処理するために使用されます。unicode()

ほとんどの場合、テキストを扱う場合は str() を使用するか、数値を含む項目のコレクションが必要な場合は list と tuple を使用する必要があります。

于 2012-08-09T12:18:52.303 に答える