2016-04-19 14 views
1

Gibt es eine Datenstruktur in Python 3, die ein Array von Booleschen Wahr oder Falsch ist? Würde dieses Array außerdem mehr Speicherkapazität als ein Array von Bytes haben?Gibt es in Python ein veränderbares Binärarray?

Ich muss in der Lage sein, einen Wert von True zu False zu ändern und auf den Index zuzugreifen; aber ich muss nicht in der Lage sein, die Größe des Arrays zu ändern.

edit: zusätzlich, wenn ein Bewegungsbefehl schneller als Indizierung wäre, wäre dies schön, auch

+0

Mögliches Duplikat von [Wie erstellt man ein Array von Bits in Python?] (Http://stackoverflow.com/questions/11669178/how-to-create-an-array-of-bits-in-python) – ShadowRanger

Antwort

0

Wie wäre Array?

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

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

Es wird die geringste Menge an Speicher verwenden und geben Ihnen einen O (1) Indexierungs

+0

Wäre dieses Array speichereffizienter als ein Array von Bytes? – user4757074

+0

FYI, ['bytearray', verfügbar seit 2.6] (https://docs.python.org/2/library/functions.html#bytearray) erfordert keinen Import oder Verwendung von Formatcodes und ist wesentlich effizienter bestimmte Zwecke (in 2.x, 'array' unterstützt nicht das Pufferprotokoll; es kann nicht mit' memoryview' oder anderen APIs verwendet werden, die "bytesähnliche Objekte" benötigen; 'bytearray' unterstützt das Pufferprotokoll) . Das "Array" mit "[0] * x" zu initialisieren, bedeutet auch, eine temporäre "Liste" 4-8x der Größe des Ergebnisses zu erstellen und dann zu iterieren; 'array.array ('B', b '\ 0' * 10)' (oder 'b '\ 1' * 10) ist 2x schneller und wird mit zunehmender Größe noch schneller. – ShadowRanger

+0

@ user4757074: 'array.array ('B')' _ist_ ein (dynamisches) Array von Bytes (im C-Sinne), genau wie 'bytearray'. Jeder zusätzliche Wert würde ein zusätzliches zu speicherndes Byte kosten (amortisiert, es wächst um einen multiplikativen Prozess, um Realloks zu minimieren), gegen eine "Liste" oder "Tupel", die eine Zeigergröße für jeden Wert kosten würde (also 4 oder 8 Bytes) auf 32- bzw. 64-Bit-Architekturen), solange das 'list' /' tuple' nur mit 0/'False und 1 /' True' gefüllt ist (das sind Singletons in CPython, also zahlen Sie keinen Objekt-Overhead für jeder einzelne Verweis auf sie). – ShadowRanger

0

Normalerweise ist es am besten, die Kosten der Verwendung eines Byte pro Wert zu zahlen, anstatt ein wenig, und Sie kann verwenden bytearray (a seit 2.6 eingebaut) für diesen Zweck:

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 

in den meisten Fällen Adressierung zu verwenden, desto effizienter ist die beste Option sein, da es Byte Dies ist in der Regel, wenn es Daten verursachen würde aus zu verschütten RAM zu einer Auslagerungsdatei.

Wenn Sie wirklich Platz für viele Flags benötigen, benötigen Sie ein Paket von Drittanbietern, das optimiert, um ein Bit pro Wert zu erhalten, z. bitarray (C-Erweiterung für maximale Geschwindigkeit, aber immer noch langsamer als bytearray für viele Zwecke) oder bitvector oder bitstring (Pure Python, um Kompilierungskomplikationen zu minimieren, und bieten manchmal zusätzliche Funktionen einfacher, aber zuverlässig langsamer als bytearray, wenn nicht Speicher beschränkt).

Verwandte Themen