在Python中生成非常大的2Darray?

2024-10-01 13:25:18 发布

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

我想用列表生成非常大的二维数组(或者,换句话说,一个矩阵)。每个元素都应该是一个浮点数。在

所以,举个例子,假设有以下代码:

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中?在


Tags: 代码importnumpy元素列表fordefas
1条回答
网友
1楼 · 发布于 2024-10-01 13:25:18

Python不一定以最紧凑的形式存储列表项,因为列表需要指向下一项的指针等。这是具有允许删除、插入等数据类型的副作用。对于简单的双向链接列表,用法是两个指针加上值,在64位机器中,列表中的每个浮点项将是24个八位字节。在实践中,实现并不是那么愚蠢,但是仍然有一些开销。在

如果您想要一个简洁的格式,我建议使用numpy.array,因为它需要的字节数与您认为的一样多(加上一个小的开销)。在

编辑糟糕。不一定。解释错误,建议有效。numpy是正确的工具,因为numpy.array因此而存在。然而,问题很可能出在别的地方。我的电脑会运行程序,即使它需要很多时间(大约。2分钟)。而且,在这之后退出python需要很长时间(实际上,它挂起了)。{cd4000在下面的python进程中报告了小于10 MB的内存使用量。可能分配的numpy数组没有很快被垃圾回收。在

但是关于我机器中原始数据的大小:

>>> import sys
>>> l = [0.0] * 1000000
>>> sys.getsizeof(l)
8000072

因此,似乎每个列表有72个八位字节的固定开销。在

^{pr2}$

所以,这是意料之中的。在

另一方面,保留和填充长列表需要一段时间(大约10秒)。另外,退出python需要一段时间。纽比也一样:

>>> a = numpy.empty((1000,1000000))
>>> a[:] = 1.0
>>> a.nbytes
8000000000

(字节计数并不完全可靠,因为对象本身为其元数据等占用了一些空间。必须有指向内存块开头、数据类型、数组形状等的指针。)

这需要更少的时间。数组的创建几乎是即时的,插入数字可能需要一两秒钟。分配和释放大量的小内存块非常耗时,虽然在64位计算机中不会造成碎片问题,但分配大数据块仍然容易得多。在

如果有很多数据可以放入数组中,那么不使用numpy需要一个很好的理由。在

相关问题 更多 >