我想用空间和时间有效的方式在Python中创建一个2D二进制(Bit)数组,因为我的2D比特阵列大约是1百万(行)*50000(0或1的列),而且我将执行按位操作这些巨大的元素.我的数组看起来像:
0 1 0 1
1 1 1 0
1 0 0 0
...
Run Code Online (Sandbox Code Playgroud)
在C++中,对我来说最有效的方式(空间)是创建一种整数数组,其中每个元素代表32位,然后我可以使用移位运算符和逐位运算符来进行运算.
现在我知道python中有一个bitarray模块.但我无法使用位数列表创建2D结构.我怎样才能做到这一点?
我在C++中知道的另一种方法是创建一个类似于地图的地图map<id, vector<int> >然后我可以像上面提到的那样操纵向量.我应该在python中使用等效的字典吗?
即使你建议我使用位数组来完成这项任务,也会很棒.如果我能够知道我是否可以让多个线程在一个bitarray接头上运行,这样我就可以使它成为多线程.谢谢您的帮助!!
编辑:
如果需要,我甚至可以继续为此创建自己的数据结构.然而,只是想在重新发明轮子之前检查一下.
怎么样:
In [11]: from bitarray import bitarray
In [12]: arr = [bitarray(50) for i in xrange(10)]
Run Code Online (Sandbox Code Playgroud)
这将创建一个 10x50 位数组,您可以按如下方式访问该数组:
In [15]: arr[0][1] = True
In [16]: arr[0][1]
Out[16]: True
Run Code Online (Sandbox Code Playgroud)
请记住,1Mx50K 数组需要大约 6GB 内存(以及 64 位操作系统上的 64 位 Python 版本)。
我是否可以让多个线程对位数组的拼接进行操作,以便我可以使其成为多线程
与通常的警告一样,这应该不是问题。请记住,由于GIL,您不太可能通过多线程实现性能改进。
根据我的评论,您可以使用集合
0 1 0 1
1 1 1 0
1 0 0 0
Run Code Online (Sandbox Code Playgroud)
可以表示为
set([(1,0), (3,0), (0,1), (1,1), (2, 1), (0,2)])
Run Code Online (Sandbox Code Playgroud)
要么
{(1,0), (3,0), (0,1), (1,1), (2, 1), (0,2)}
Run Code Online (Sandbox Code Playgroud)
AND相当于2组的交集
OR是2组的并集