Python Numpy整数高内存使用率

Python Numpy整数高内存使用率,python,python-2.7,numpy,Python,Python 2.7,Numpy,我试图在Python中高效地存储2500万个整数。最好使用Numpy,这样我可以在以后对它们执行操作 其思想是将它们存储为4字节无符号整数。因此,所需的内存应该是25M个条目*4个字节=95MB 我已经编写了以下测试代码,报告的内存消耗几乎是700MB,为什么 a = np.array([], dtype=np.uint32) # TEST MEMORY FOR PUTTING 25 MILLION INTEGERS IN MEMORY for i in range(0, 25000000):

我试图在Python中高效地存储2500万个整数。最好使用Numpy,这样我可以在以后对它们执行操作

其思想是将它们存储为4字节无符号整数。因此,所需的内存应该是25M个条目*4个字节=95MB

我已经编写了以下测试代码,报告的内存消耗几乎是700MB,为什么

a = np.array([], dtype=np.uint32)

# TEST MEMORY FOR PUTTING 25 MILLION INTEGERS IN MEMORY
for i in range(0, 25000000):
    np.append(a, np.asarray([i], dtype=np.uint32))
例如,如果我这样做,它将按预期工作:

a = np.random.random_integers(1, 25000000, size=25000000)

为什么?

实际上问题是
范围(0,25000000)
,因为这会创建一个由
int
s组成的列表

包含这样一个列表所需的内存是(为简单起见,假设每个整数32字节)
25kk*32B=800kkB~762MB

使用生成器,如
xrange
或更新到python3。在那里
range
的内存开销稍微低一点(因为那里的值不是预先计算的,而是在需要时进行计算)

实际的numpy数组始终为空(因为您只使用
np.append
-不会存储append的结果,因此会在之后直接丢弃!),因此可忽略


我会处理你的
a=np.random.random\u整数(1250000,size=25000000)
,然后(如果你愿意)将其转换为
np.uint

一个快速的尝试是使用
xrange
而不是
range
<代码>范围消耗大量内存。什么是
lst
?为什么不将
np.append的结果保存到任何地方?向我们展示您实际运行的完整代码,我们可以将它粘贴到解释器会话中来重现问题。为什么不直接使用
np.arange
?@jme
np.arange
也会在您访问它时创建完整的数组。您知道您的
for
-循环代码不会创建一个包含
25000000
整数的数组,不是吗?您只需创建(并立即丢弃)一个新的1元素数组
25000000次。如果你想构建一个更大的数组,你需要使用
a=np.append(a,…)
(然后你会发现
for
循环的
速度非常慢)。你的大小计算似乎是假设
int32
中的32表示它需要32字节。事实并非如此;“32”号是位。另外,Python 2整数不一定是32位的。Python2int需要12或24个字节,这取决于您使用的是32位还是64位Python。它需要为
PyObject\u HEAD
、存储实际数据的
long
和结构填充留出空间。列表中的指针还需要额外的4或8字节,这些字节不计入12/24数字。也就是说,
范围
看起来应该是所有内存消耗的来源。而且,
xrange
对象不是生成器。生成器是一种特定类型的迭代器,
xrange
对象甚至不是迭代器
xrange
对象最好被描述为懒惰的iterables。@user2357112-感谢您的输入,我不知道
xrange
不是生成器!我已经更新了答案。谢谢你,小姐。事实上,当i<25000000
i+=1
时,使用
将循环更改为手动增量时,内存使用情况与预期一致。