2012-05-01 11 views
6

Voglio creare un array binario (bit) 2D in Python in modo efficiente in termini di spazio e tempo in quanto il mio bitarray 2D sarebbe di circa 1 milione (righe) * 50000 (colonne di 0 o 1) e inoltre eseguirò operazioni bit a bit su questi enormi elementi. La mia serie sarebbe simile:Spazio Python + tempo efficiente Struttura dei dati per archiviare array di bit 2D

0 1 0 1 
1 1 1 0 
1 0 0 0 
... 

In C++ modo più efficiente (spazio) per me sarebbe quella di creare una sorta di array di interi in cui ogni elemento rappresenta 32 bit e poi posso usare gli operatori di spostamento accoppiato con operatori bit-saggio per effettuare operazioni.

Ora so che esiste un modulo bitarray in python. Ma non riesco a creare una struttura 2D usando la lista di array di bit. Come posso fare questo?

Un altro modo che conosco in C++ sarebbe quello di creare una mappa come map<id, vector<int> > in cui quindi posso manipolare il vettore come ho menzionato sopra. Dovrei usare il dizionario equivalente in python?

Anche se mi suggerisci un modo per utilizzare l'array di bit per questa attività, sarà grandioso se riesco a capire se posso far funzionare più thread su una giunzione di bitarray in modo che possa renderlo multithread. Grazie per l'aiuto!!

EDIT:

posso anche andare a creare la mia struttura di dati per questo se il necessario. Comunque volevo solo controllare prima di reinventare la ruota.

+2

È un array sparse? Altrimenti avrete bisogno di ~ 6 GB per memorizzare tutti quei bit –

+1

bit per bit è ridondante quando il tipo di dati è bits :). Forse puoi semplicemente usare un 'set' e le normali operazioni di set. L'appartenenza al set può rappresentare 'True' –

+1

Le operazioni bit a bit si applicano solo quando si è bloccati sull'idea che è necessario utilizzare 32 bit int (o simili) per eseguire il backup dei bit. –

risposta

5

Come per il mio commento, si può essere in grado di utilizzare i set

0 1 0 1 
1 1 1 0 
1 0 0 0 

può essere rappresentato come

set([(1,0), (3,0), (0,1), (1,1), (2, 1), (0,2)]) 

o

{(1,0), (3,0), (0,1), (1,1), (2, 1), (0,2)} 

una ed è equivalente ad un incrocio di 2 set
OR è l'unione dei 2 set

+0

Sarebbe '(3,0)' invece di '(4,0)'. –

+0

@mteckert, grazie, corretto –

+0

@ Yavar, rappresentano il (x, y) di ogni '1'. y sta contando dall'alto in alto in questo caso, ma puoi cambiarlo in qualsiasi modo finché sei coerente –

4

Come circa la seguente:

In [11]: from bitarray import bitarray 

In [12]: arr = [bitarray(50) for i in xrange(10)] 

Questo crea una matrice di bit 10x50, cui è possibile accedere come segue:

In [15]: arr[0][1] = True 

In [16]: arr[0][1] 
Out[16]: True 

Tenete a mente che un allineamento 1Mx50K richiederebbe circa 6 GB di memoria (e una versione a 64 bit di Python su un sistema operativo a 64 bit).

se posso avere più thread operano su una giunzione di BitArray modo che possa rendere MultiThreaded

Questo non dovrebbe essere un problema, con le solite precauzioni. Tieni presente che a causa dello GIL è improbabile che tu ottenga miglioramenti delle prestazioni attraverso il multithreading.

2

Puoi usare numpy?

>>> import numpy 
>>> A = numpy.zeros((50000, 1000000), dtype=bool) 

MODIFICA: non sembra il più efficiente in termini di spazio. Utilizza 50 GB (1 byte per bool). Qualcuno sa se Numpy ha un modo per usare bools imballati?

Problemi correlati