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 个字节。这个空间是否用于指向关联的内置方法和属性?
计算使用:
\nsize = narray.size * narray.itemsize\nRun Code Online (Sandbox Code Playgroud)\n不包括数组对象的非元素属性消耗的内存。这可以通过以下文档进行验证ndarray.nbytes:
>>> x = np.zeros((3,5,2), dtype=np.complex128)\n>>> x.nbytes\n480\n>>> np.prod(x.shape) * x.itemsize\n480\nRun Code Online (Sandbox Code Playgroud)\n在上面的链接中,可以看到ndarray.nbytes:
\n\n不包括数组对象的非元素属性\n所消耗的内存。
\n
请注意,从上面的代码中您可以得出结论,您的计算排除了非元素属性,因为该值等于 中的值ndarray.nbytes。
非元素属性的列表可以在Array Attributes部分中找到,为了完整起见,包括在此处:
\n\n\nndarray.flags有关数组内存布局的信息。
\n
\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基础对象(如果内存来自其他对象)。
关于sys.getsizeof它,可以在文档(强调我的)中读到:
\n\n仅考虑直接归因于该对象的内存消耗,\n而不考虑其引用的对象的内存消耗。
\n
| 归档时间: |
|
| 查看次数: |
4487 次 |
| 最近记录: |