与numpy的OBJECTS数组相比,列表列表在内存方面有什么优点/缺点?
问题内容:
我试图了解使用numpy
列表对列表列表进行比较的数组所涉及的内存和其他开销。 dtype
object
这会随着尺寸变化吗? 例如2D vs 3D vs ND。
使用numpy
数组时,我可以想到的一些好处是,诸如 .shape
, .T
您可以np.matrix
更快地将它们转换为矩阵。
还有别的事吗?
另外,如果有人感兴趣,我正在使用的对象是:
import gmpy2 as gm
gm.mpfr( '0' ) # <-- this is the object
编辑:
为了澄清一下,我对numpy
数组类型object
不是本机numpy类型的情况感兴趣。
编辑2:
有关速度方面的后续跟进。
问题答案:
我将回答您的主要问题,而忽略其他问题(移调的性能等)。所以:
我想了解,使用numpy的名单将有…只是为了澄清我很感兴趣,在numpy的数组类型是这样的内存和其它开销的影响
object
不是float
,double
或int
Python列表是指向Python对象的指针的数组,这些对象包装了您存储在其中的任何实际值,外加一些额外的余量以使其能够快速有效地扩展。只是为了便于计算,我们将其称为松弛20%。例如,由10000个32位整数组成的列表占用了数组96000字节,为Python整数对象占用了约240000字节,再加上列表本身的开销很小,又说了80个字节。
NumPy数组是您存储在其中的任何实际值的数组。例如,由10000个32位整数组成的数组占用40000个字节,加上数组本身的少量开销(例如80个字节)。但是,当您使用dtype时object
,每个“实际值”都只是一个指向Python对象的指针,就像使用一样list
。
因此,这里唯一真正的区别是松弛:数组将使用320080字节,而列表将使用336080字节。差别不大,但是很重要。
而且,在2D与ND或沿给定尺寸的尺寸中,一个变得比另一个更快。
是的,嵌套列表的增长速度会更快…但是数量不会很大。
在numpy的多维数组存储为一个巨大的阵列(在C或Fortran的跨步顺序),形状,从而是(10000,)
,(100, 100)
,或者(10, 10, 10, 10)
,它的大小相同。(开销可能会增加几个字节,以存储有关跨步的更多信息,但是如果我们要说的是256字节与320K中的80字节,谁在乎?)
另一方面,嵌套列表包含更多列表,每个级别都有松弛和开销。例如,由10个列表组成的10个列表组成的10个整数列表具有1 + 10 + 100 +
1000个包含12个指针的数组和1 + 10 + 100 + 1000个列表头。
因此,该数组仍在使用320080字节,或者可能是320256字节,但列表使用的是435536。
如果您想更多地了解如何list
实现……那么,这取决于您使用的实现。但是在CPython中,C
API
几乎可以保证它将存储连续的数组PyObject *
,而附加摊销固定时间这一事实实际上要求它留出按比例增长的松弛度。您可以在标题和源代码中看到它的作用。(此外,请记住,从该源获得的特定大小通常取决于您在其上编译的平台。最重要的是,由于到处都有指针,因此64位平台的大小通常在50-100之间与32位平台相比,大多数对象每个对象的开销增加了%。)