我想用列表生成非常大的二维数组(或者,换句话说,一个矩阵)。每个元素都应该是一个浮点数。在
所以,举个例子,假设有以下代码:
import numpy as np
N = 32000
def largeMat():
m = []
for i in range(N):
l = list(np.ones(N))
m.append(l)
if i % 1000 == 0:
print i
return m
m = largeMat()
我有12GB的RAM,但是当代码到达矩阵的第10000行时,我的RAM已经满了。现在,如果我没有错的话,每个浮点都是64位大(或8字节),因此总占用RAM应该是:
^{pr2}$为什么python会填满我的整个RAM,甚至开始分配到swap中?在
Python不一定以最紧凑的形式存储列表项,因为列表需要指向下一项的指针等。这是具有允许删除、插入等数据类型的副作用。对于简单的双向链接列表,用法是两个指针加上值,在64位机器中,列表中的每个浮点项将是24个八位字节。在实践中,实现并不是那么愚蠢,但是仍然有一些开销。在
如果您想要一个简洁的格式,我建议使用
numpy.array
,因为它需要的字节数与您认为的一样多(加上一个小的开销)。在编辑糟糕。不一定。解释错误,建议有效。
numpy
是正确的工具,因为numpy.array
因此而存在。然而,问题很可能出在别的地方。我的电脑会运行程序,即使它需要很多时间(大约。2分钟)。而且,在这之后退出python需要很长时间(实际上,它挂起了)。{cd4000在下面的python进程中报告了小于10 MB的内存使用量。可能分配的numpy
数组没有很快被垃圾回收。在但是关于我机器中原始数据的大小:
因此,似乎每个列表有72个八位字节的固定开销。在
^{pr2}$所以,这是意料之中的。在
另一方面,保留和填充长列表需要一段时间(大约10秒)。另外,退出python需要一段时间。纽比也一样:
(字节计数并不完全可靠,因为对象本身为其元数据等占用了一些空间。必须有指向内存块开头、数据类型、数组形状等的指针。)
这需要更少的时间。数组的创建几乎是即时的,插入数字可能需要一两秒钟。分配和释放大量的小内存块非常耗时,虽然在64位计算机中不会造成碎片问题,但分配大数据块仍然容易得多。在
如果有很多数据可以放入数组中,那么不使用
numpy
需要一个很好的理由。在相关问题 更多 >
编程相关推荐