Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在内存方面,与numpy对象数组相比,列表列表的优点/缺点是什么?_Python_Arrays_Numpy - Fatal编程技术网

Python 在内存方面,与numpy对象数组相比,列表列表的优点/缺点是什么?

Python 在内存方面,与numpy对象数组相比,列表列表的优点/缺点是什么?,python,arrays,numpy,Python,Arrays,Numpy,我试图理解与列表列表相比,使用numpy列表对dtype对象数组的内存和其他开销影响 这会随着维度的变化而变化吗?例如2D vs 3D vs N-D 当使用numpy数组时,我能想到的一些好处是,像.shape,.T这样的东西,并且可以更快地将它们转换为矩阵 还有别的吗? 此外,如果有人感兴趣,我使用的对象是: import gmpy2 as gm gm.mpfr( '0' ) # <-- this is

我试图理解与列表列表相比,使用
numpy
列表对
dtype
对象数组的内存和其他开销影响

这会随着维度的变化而变化吗?例如2D vs 3D vs N-D

当使用
numpy
数组时,我能想到的一些好处是,像
.shape
.T
这样的东西,并且可以更快地将它们转换为矩阵

还有别的吗?

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

import gmpy2 as gm
gm.mpfr( '0' )                                           # <-- this is the object
将gmpy2导入为gm

gm.mpfr('0')#我将回答您的主要问题,而不回答其他问题(转置的性能等)。因此:

我试图理解使用numpy列表会带来的内存和其他开销影响…只是想澄清一下,我感兴趣的是numpy数组类型是
object
而不是
float
double
int

Python列表是指向Python对象的指针数组,它包含存储在其中的任何实际值,再加上一些额外的空闲时间,以便能够在运行时高效地扩展它。为了便于计算,我们将其称为松弛20%。例如,一个包含10000个32位整数的列表占用了(比如)96000字节的数组,加上大约240000字节的Python整数对象,再加上列表本身的一小部分开销,比如说80字节

NumPy数组是存储在其中的任何实际值的数组。例如,一个包含10000个32位整数的数组占用40000字节,再加上数组本身的少量开销,比如说80字节。但是当您使用dtype
对象时,每个“实际值”都只是一个指向Python对象的指针,就像使用
列表一样

因此,这里唯一真正的区别是松弛:数组将使用320080字节,而列表将使用336080字节。虽然差别不大,但也很重要


此外,在2D与ND中,还是在给定尺寸上,一个比另一个快

是的,嵌套列表将增加得更快…但不会增加太多

numpy中的多维数组存储为一个巨型数组(以C或Fortran跨步顺序),因此无论形状是
(10000,)
(100100)
,还是
(10,10,10)
,大小都相同。(开销可能会增加几个字节以存储更多关于跨步的信息,但是如果我们说的是256字节,而不是320K中的80字节,谁在乎呢?)

另一方面,嵌套列表有更多的列表,每个级别都有空闲和开销。例如,一个由10个整数列表组成的10个列表的列表有1+10+100+1000个12指针数组和1+10+100+1000个列表头

因此,数组仍然使用320080字节,或者320256字节,但是列表使用435536字节



如果您想更多地了解
list
是如何实现的……那么,这取决于您使用的实现。但在CPython中,基本上保证了它将存储一个连续的
PyObject*
数组,而事实上追加是按固定时间摊销的,这就要求它保留按比例增长的松弛。你可以从中看到,这正是它所做的。(另外,请记住,您从该源获得的具体大小通常取决于编译它的平台。最重要的是,因为到处都有指针,所以对于大多数对象,64位平台的每个对象的开销往往比32位平台多50-100%。)

它的答案可能是相关的……事实上。虽然有一件事让我担心,那就是numpy对于浮点运算速度更快,但是当你有对象而不是浮点运算时会发生什么呢?numpy数组是否简化为列表列表?这似乎是一个过于宽泛的问题。这里隐藏着一些具体的问题,比如比较10x10、100x100和10000个int32数组的内存使用情况与等效的嵌套Int列表,但每一个都应该有自己的问题。嗯。。。好的,我应该试着像你说的那样把它分成一个记忆问题和一个速度问题吗?此外,int32案例是一种原生numpy类型,因此我不确定它是否与问题相关。这个问题的重点是当数组是dtype
object
@evan54时会发生什么:是的,这是一个很好的问题。这很有趣,我认为可能是+1。我对列表/对象数组的松弛大小和开销大小的确切值感兴趣。有什么可以让我读到的吗?@Eikenberg:我已经编辑了答案。因为它没有任何文档记录,所以您需要选择一个您关心的Python实现和版本并阅读源代码。我已经链接到了CPython主干版本的源代码。是的,很漂亮,非常感谢这些非常有用的代码links@eryksun:谢谢你的接球!编辑。