Python空间+时间有效的数据结构,用于存储2D位数组

时间:2012-05-01 10:25:19

标签: python

我想用空间和时间有效的方式在Python中创建一个2D二进制(Bit)数组,因为我的2D比特阵列大约是1百万(行)* 50000(0或1的列),我也会表现对这些巨大元素的按位运算。我的数组看起来像:

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

在C ++中,对我来说最有效的方式(空间)是创建一种整数数组,其中每个元素代表32位,然后我可以使用移位运算符和逐位运算符来进行运算。

现在我知道python中有一个bitarray模块。但我无法使用位数列表创建2D结构。我怎么能这样做?

我在C ++中知道的另一种方法是创建一个类似map<id, vector<int> >的地图,然后我可以像上面提到的那样操纵向量。我应该在python中使用等效的字典吗?

即使你建议我使用位数组来完成这项任务,也会很棒。如果我能知道我是否可以在一个bitarray接头上运行多个线程,这样我就可以使它成为多线程。谢谢你的帮助!!

编辑:

如果需要,我甚至可以继续为此创建自己的数据结构。然而,只是想在重新发明轮子之前检查一下。

3 个答案:

答案 0 :(得分:5)

根据我的评论,你可以使用套装

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

可以表示为

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

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

AND相当于2组的交集 OR是两组的联合

答案 1 :(得分:4)

以下内容如何:

In [11]: from bitarray import bitarray

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

这将创建一个10x50位数组,您可以按如下方式访问该数组:

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

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

请记住,1Mx50K阵列需要大约6GB内存(64位操作系统上需要64位Python)。

  

我是否可以在一个bitarray接头上运行多个线程,以便我可以使它成为多线程

这应该不是问题,通常需要注意。请记住,由于GIL,您不太可能通过多线程实现性能提升。

答案 2 :(得分:2)

你能用numpy吗?

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

编辑:似乎没有最节省空间。使用50GB(每个bool 1个字节)。有没有人知道numpy是否有办法使用打包的bool?