与MEMORY相关的numpy数组OBJECTS相比,列表列表的优点/缺点是什么?

eva*_*n54 5 python arrays numpy

我试图理解使用numpy列表对列表列表进行比较的内存和其他开销影响.dtype object

这是否随维度而变化?例如2D与3D对比ND.

我在使用numpy数组时可以想到的一些好处是类似的东西.shape,.T并且你可以np.matrix更快地将它们作为矩阵转换.

还有别的事吗?

此外,如果有人对我正在使用的对象感兴趣:

import gmpy2 as gm
gm.mpfr( '0' )                                           # <-- this is the object
Run Code Online (Sandbox Code Playgroud)

编辑:

只是为了澄清我对numpy数组类型object不是本机numpy类型的情况感兴趣.

编辑2:

有关速度的相关跟进.

与针对SPEED的numpy OBJECTS数组相比,列表列表的优点/缺点是什么?

aba*_*ert 8

我将回答你的主要问题,并将其他问题(转置的表现等)排除在外.所以:

我试图理解使用numpy列表会产生的内存和其他开销问题......只是为了澄清我对numpy数组类型object不是a 的情况感兴趣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位平台多%.)