与Python中的array.array
对象相比,list
对象的内存占用较小。像下面那样创建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
使用了要构造的列表。使用数组如何提高内存效率?
答案 0 :(得分:0)
通过使用array.array
,您将存储相邻的类似于C的基本值,而不是对象。如果数组太大,以至于初始化列表的大小令您担心,请对迭代器使用迭代器。这样可以将数组初始化期间的内存使用减少到单个元素。
答案 1 :(得分:0)
sys.getsizeof
不是递归的。因此它向您显示列表占用了多少内存。但不是列表的内容。试试这个:
mylist = [ 5000, 5001, 5002 ]
sys.getsizeof(mylist) + sum(sys.getsizeof(q) for q in mylist)
输出172
。
array.array
当然会使用较少的内存,它还会压缩密度,因此对缓存更友好。
在您的示例中,列表还用于创建array.array
,然后立即销毁。所以这里没什么大问题。