将python长整数放入内存,中间没有任何空格

2024-04-26 22:45:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我想把许多大的长整数放到内存中,它们之间没有任何空格。如何在linux中使用Python2.7代码实现这一点?你知道吗

大的长整数都使用相同的位数。总共有大约4GB的数据。留下几个位的空间,使每个长整数在内存中使用8位的倍数是可以的。我想稍后对它们进行位运算。你知道吗

到目前为止,我使用的是python列表。但我不确定这是否会在内存中留下整数之间的空间。ctypes有帮助吗?你知道吗

谢谢你。你知道吗

旧代码使用位数组(https://pypi.python.org/pypi/bitarray/0.8.1

import bitarray
data = bitarray.bitarray()
with open('data.bin', 'rb') as f:
    data.fromfile(f)
result = data[:750000] & data[750000:750000*2]

这样可以工作,并且位数组在内存中没有间隙。但是,位数组按位and比本地python在计算机上对长整数的按位运算慢6倍左右。在旧代码中切片位数组和在新代码中访问列表中的元素所用的时间大致相同。你知道吗

更新的代码:

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]

努比: 在上述代码中。结果=数据[0]&数据[1]创建新的长整数。 Numpy有out选项numpy.按位\u和. 这样可以避免创建新的numpy数组。然而,numpy的bool数组似乎使用了每个bool一个字节,而不是每个bool一个位。同时,将布尔数组转换为数字.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

Tags: 数据内存代码importnumpydataas空间
2条回答

空间效率低下的主要原因是Python long的内部结构。假设是64位平台,Python只使用32位中的30位来存储值。gmpy2库提供对GMP(GNU多精度算术库)的访问。gmpy2.mpz类型的内部结构使用所有可用位。在这里存储一个750000位的值。你知道吗

>>> import gmpy2
>>> import sys
>>> a=long('1'*750000, 2)
>>> sys.getsizeof(a)
100024
>>> sys.getsizeof(gmpy2.mpz(a))
93792

使用``gmpy2.mpz`的&操作也明显更快。你知道吗

$ python -m timeit -s "a=long('A'*93750,16);b=long('7'*93750)" "c=a & b"
100000 loops, best of 3: 7.78 usec per loop
$ python -m timeit -s "import gmpy2;a=gmpy2.mpz('A'*93750,16);b=gmpy2.mpz('7'*93750)" "c=a & b"
100000 loops, best of 3: 4.44 usec per loop

如果所有操作都已就绪,gmpy2.xmpz类型允许在不创建新实例的情况下更改实例的内部值。只要所有的操作都是立即进行的,速度就会更快。你知道吗

$ python -m timeit -s "import gmpy2;a=gmpy2.xmpz('A'*93750,16);b=gmpy2.xmpz('7'*93750)" "a &= b"
100000 loops, best of 3: 3.31 usec per loop

免责声明:我维护gmpy2库。你知道吗

您可以使用array模块,例如:

import array
ar = array('l', [25L, 26L, 27L])
ar[1]  # 26L

相关问题 更多 >