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
メモリや速度に違いはありますか? それぞれの好ましいユースケースは何ですか?
bytearray
Python 2.x のstring
型の後継です。これは基本的に組み込みのバイト配列型です。元の型とは異なり、string
可変です。
一方array
、モジュールは、外部と通信するためのバイナリ データ構造を作成するために作成されました (たとえば、バイナリ ファイル形式の読み取り/書き込み)。
とは異なりbytearray
、すべての種類の配列要素をサポートします。柔軟です。
したがって、バイト配列だけが必要な場合は、正常にbytearray
動作するはずです。柔軟なフォーマットが必要な場合 (配列の要素の型を実行時に決定する必要がある場合など)array.array
は、あなたの友人です。
bytearray
コードを見なくても、さまざまな要素の種類を考慮する必要がないため、おそらく高速であると思います。array('B')
しかし、 を返す可能性がありますbytearray
。
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']
私のテストでは、どちらもほとんど同じサイズのメモリを使用していましたが、読み取りと書き込みのために大きなバッファを作成すると、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
array.array
モジュールを自分で使用する必要はほとんどありません。struct
通常、モジュールのように、バイナリ ファイル形式またはプロトコルのバイナリ データを作成するために使用されます。
bytearray
Unicode テキストに使用されるPython 3str()
または Python 2とは対照的に、通常はエンコードされたテキスト (utf-8、ascii など) を処理するために使用されます。unicode()
ほとんどの場合、テキストを扱う場合は str() を使用するか、数値を含む項目のコレクションが必要な場合は list と tuple を使用する必要があります。