我想将许多大型长整数放入内存中,并且它们之间没有任何空格。如何在Linux中使用Python 2.7代码实现?这些大型长整数都使用相同的位数,总共有约4GB的数据。在每个长整数之间留下几个位的空格,以使每个长整数在内存中使用8位的倍数是可以的。我后来想对它们进行按位操作。目前,我正在使用Python列表。但我不确定它是否在整数之间不留下内存空间。ctypes能帮助吗?谢谢。旧代码使用了bitarray (https://pypi.python.org/pypi/bitarray/0.8.1)。
Numpy: 在上述代码中,result = data [0]&data [1]会创建一个新的长整型。 Numpy对于numpy.bitwise_and有一个"out"选项。这将避免创建新的numpy数组。然而,numpy的布尔数组似乎每个布尔值使用一个字节而不是一个位。将布尔数组转换为numpy.uint8数组可避免此问题,但计算设置位的数量太慢。
Python的原生数组无法处理大的长整型:
import bitarray
data = bitarray.bitarray()
with open('data.bin', 'rb') as f:
data.fromfile(f)
result = data[:750000] & data[750000:750000*2]
这个方案可行,bitarray在内存中没有间隙。但是,在计算机上,bitarray的按位与运算速度比本地python长整型的按位操作慢了约6倍。在旧代码中对bitarray进行切片和在新代码中访问列表中的元素使用大致相同的时间。
新代码:
import cPickle as pickle
with open('data.pickle', 'rb') as f:
data = pickle.load(f)
# data is a list of python's (long) integers
result = data[0] & data[1]
Numpy: 在上述代码中,result = data [0]&data [1]会创建一个新的长整型。 Numpy对于numpy.bitwise_and有一个"out"选项。这将避免创建新的numpy数组。然而,numpy的布尔数组似乎每个布尔值使用一个字节而不是一个位。将布尔数组转换为numpy.uint8数组可避免此问题,但计算设置位的数量太慢。
Python的原生数组无法处理大的长整型:
import array
xstr = ''
for i in xrange(750000):
xstr += '1'
x = int(xstr, 2)
ar = array.array('l',[x,x,x])
# OverflowError: Python int too large to convert to C long
data1 = bytearray(93750);
data2 = bytearray(93750);
f.readinto(data1);
f.readinto(data2);
result = map(operator._and, data1, data2)
。这假设位被打包进文件中。 - Eryk Sun