首页 > 解决方案 > 列表对象作为数组对象的参数值是否占用 Python 中的内存?

问题描述

array.array对象的内存占用比listPython 中的对象小。当您创建以下类似内容时,它是否仍然有效array.array

from array import array
array('l', [1, 2, 3, 4, 5])

我们仍然在那里创建一个列表对象(作为参数值)来创建该数组。这不是使数组不值得使用吗?

更新:看起来我应该重新考虑数组占用的空间比列表少的说法。似乎它们的行为在不同的 Python 版本中有所不同:

Python 3.5.2 
>>> import array, sys
>>> mylist = [1, 2, 3]
>>> myarray = array.array('i', [1, 2, 3])
>>> sys.getsizeof(mylist)
44
>>> sys.getsizeof(myarray)
44

Python 3.6.3 
>>> import array, sys
>>> mylist = [1, 2, 3]
>>> myarray = array.array('i', [1, 2, 3])
>>> sys.getsizeof(mylist)
88
>>> sys.getsizeof(myarray)
76

但是,我原来的问题仍然存在(对于 Python 3.6)。myarray使用要构建的列表。如何使用数组更节省内存?

标签: pythonarrayslistmemory

解决方案


sys.getsizeof不是递归的。所以它会告诉你,列表占用了多少内存。但不是列表的内容。尝试这个:

mylist = [ 5000, 5001, 5002 ]
sys.getsizeof(mylist) + sum(sys.getsizeof(q) for q in mylist)

输出172

array.array肯定是使用更少的内存,它也更密集,所以它对缓存更友好。

在您的示例中,列表也用于创建array.array然后立即销毁。所以这里没有什么大问题。


推荐阅读