NumPy 数组真的比 python 列表占用更少的内存吗?

use*_*539 8 python memory-management numpy

请参考下面的执行 -

import sys

_list = [2,55,87]
print(f'1 - Memory used by Python List - {sys.getsizeof(_list)}')
      
narray = np.array([2,55,87])
size = narray.size * narray.itemsize
print(f'2 - Memory usage of np array using itemsize  - {size}')
print(f'3 - Memory usage of np array using getsizeof  - {sys.getsizeof(narray)}')
Run Code Online (Sandbox Code Playgroud)

这是我得到的结果

1 - Memory used by Python List - 80
2 - Memory usage of np array using itemsize  - 12
3 - Memory usage of np array using getsizeof  - 116
Run Code Online (Sandbox Code Playgroud)

一种计算方法表明 numpy 数组消耗的内存太少,但另一种方法说它比常规 python 列表消耗更多?我不应该将 getSizeOf 与 numpy 数组一起使用吗?我在这里做错了什么?

编辑 - 我刚刚检查过,一个空的 python 列表消耗 56 个字节,而一个空的 np 数组消耗 104 个字节。这个空间是否用于指向关联的内置方法和属性?

Dan*_*ejo 7

计算使用:

\n
size = narray.size * narray.itemsize\n
Run Code Online (Sandbox Code Playgroud)\n

不包括数组对象的非元素属性消耗的内存。这可以通过以下文档进行验证ndarray.nbytes

\n
>>> x = np.zeros((3,5,2), dtype=np.complex128)\n>>> x.nbytes\n480\n>>> np.prod(x.shape) * x.itemsize\n480\n
Run Code Online (Sandbox Code Playgroud)\n

在上面的链接中,可以看到ndarray.nbytes

\n
\n

不包括数组对象的非元素属性\n所消耗的内存。

\n
\n

请注意,从上面的代码中您可以得出结论,您的计算排除了非元素属性,因为该值等于 中的值ndarray.nbytes

\n

非元素属性的列表可以在Array Attributes部分中找到,为了完整起见,包括在此处:

\n
\n

ndarray.flags有关数组内存布局的信息。
\n ndarray.shape数组维度的元组。
\n ndarray.strides遍历数组时在每个维度中步进的\n字节元组。
\n ndarray.ndim数组维数。
\n ndarray.data指向数组\xe2\x80\x99s 数据开头的 Python 缓冲区对象。
\n ndarray.size数组中的元素数量。
\n ndarray.itemsize一个数组元素的长度(以字节为单位)。
\n ndarray.nbytes数组元素消耗的总字节数。
\n ndarray.base基础对象(如果内存来自其他对象)。

\n
\n

关于sys.getsizeof它,可以在文档(强调我的)中读到:

\n
\n

仅考虑直接归因于该对象的内存消耗,\n而不考虑其引用的对象的内存消耗。

\n
\n