微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

内存使用:numpy-arrays 与 python-lists

如何解决内存使用:numpy-arrays 与 python-lists

Numpy 以优化数组和优于 python 列表的各种优势而闻名。 但是当我检查内存使用情况时,python 列表的空间比 numpy 数组少。 我使用的代码在下面输入。 谁能解释一下为什么?

import sys
Z = np.zeros((10,10),dtype = int)
A = [[0] * 10] * 10
print(A,'\n',f'{sys.getsizeof(A)} bytes')
print(Z,f'{Z.size * Z.itemsize} bytes')

解决方法

您没有正确测量;本机 Python 列表仅包含 10 个引用。您还需要添加子列表的总体大小:

>>> sys.getsizeof(A) + sum(map(sys.getsizeof,A))
1496

而且情况可能会变得更糟:子列表中的每个元素是一个引用(对 int)。很难检查 Python 实现是否对其进行了优化并将实际数字存储在列表中。

您也低估了 numpy 数组的大小,因为它包含一个标题:

>>> Z.size * Z.itemsize
800
>>> sys.getsizeof(Z)
912

无论哪种情况,它都不是一门精确的科学,将取决于您的平台和 Python 实现。

,

根据规范(https://docs.python.org/3/library/sys.html#sys.getsizeof),“只计算直接归因于对象的内存消耗,而不是它引用的对象的内存消耗。” 同样“getsizeof 调用对象的” sizeof 方法

所以你得到的只是容器的大小(一个列表对象)。

请检查 https://code.activestate.com/recipes/577504/ 以获得完整的大小计算,因为仅使用了两个唯一对象,因此您的示例返回 296 字节。一个列表 [0 0 0 0 0 0 0 0 0 0] 和 int 0。

如果用不同的值初始化列表,整体大小会增加,并且会比 np.array 大,np.array 为 numpy.int32 类型元素保留了 4 字节,加上它自己内部数据结构的大小。

在此处查找包含示例的详细信息:https://jakevdp.github.io/PythonDataScienceHandbook/02.01-understanding-data-types.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。