2016-04-19 14 views
1

Python 3のデータ構造は、ブール値TrueまたはFalseの配列ですか?さらに、この配列はバイト配列よりもメモリ効率が良いでしょうか?Pythonに変更可能なバイナリ配列がありますか?

値をTrueからFalseに変更し、インデックスでアクセスできる必要があります。配列のサイズを変更する必要はありません。

編集:moveコマンドは、インデックスよりも高速であるかどう加えて、これは、アレイの使用についてどのように

+0

[Pythonでビット配列を作成するにはどうすればいいですか?](http://stackoverflow.com/questions/11669178/how-to-create-an-array-of-bits-in-python) – ShadowRanger

答えて

0

もいいだろうか?

import array 
a = array.array("B", [0]*10) #fix size of 10 - all False 

a[1] = 1 # Mutable, Yay! 
print(a) 

それはメモリの最小量を使用し、あなたのOを与える(1)インデックス

+0

この配列は、バイト配列よりもメモリ効率が良いでしょうか? – user4757074

+0

FYI、['bytearray'、2.6以降利用可能](https://docs.python.org/2/library/functions.html#bytearray)では、フォーマットコードのインポートや使用は必要ありません。 (2.xの 'array'はバッファプロトコルをサポートしていません;' memoryview'や "バイト様オブジェクト"を必要とする他のAPIでは使用できません; bytearray'はバッファプロトコルをサポートしています) 。また、 '[0] * xで' array'を初期化することは、一時的な 'list'を結果の大きさの4-8倍にして反復することを意味します。 'array.array( 'B'、b '\ 0' * 10)'(または 'b '\ 1' * 10)は2倍高​​速で、サイズが大きくなるにつれてさらに高速になります。 – ShadowRanger

+0

@ user4757074: 'array.array( 'B')' _t_rayと同様に_is_(動的)バイト配列(Cの意味で)。各追加値は、各値に対して1つのポインタサイズの変数を必要とする 'list'または' tuple '(つまり、4バイトまたは8バイト)と比較して、ストアする追加の1バイトと、 'list' /' tuple'が0/'Falseと1 /' True'だけで満たされている限り(これはCPythonではシングルトンなので、オブジェクトオーバーヘッドを支払う必要はありません)それぞれ別個に参照する)。 – ShadowRanger

0

は通常、それが値ごとにバイトではなくビットを使用しての費用を支払うことをお勧めします、そしてあなたこの目的のために(ビルトイン2.6以降)bytearrayを使用することができます。

a = bytearray(100)   # 100 values all initialized to 0/False 
# or initially true: 
b = bytearray(b'\x01' * 100) # 100 values all initialized to 1/True 

# While you'll get 0 and 1 back, True and False can be assigned to it 
a[1] = True 
b[1] = False 

それはデータからこぼれ原因となる場合を除き、ほとんどの場合、バイトアドレスを使用する方が効率的だとして、これは通常、最良の選択肢であるさRAMをスワップファイルに変換します。

多くのフラグのスペースが本当に必要な場合は、値ごとに1ビットを得るために最適化されたサードパーティのパッケージが必要です。 bitarray(最高速度のC拡張、多くの目的ではbytearrayより遅い)またはbitvectorまたはbitstring(コンパイルの複雑さを最小限に抑え、時には追加機能をより簡単に提供しますが、メモリが制約されていない場合はbytearrayよりも確実に遅くなります)

関連する問題