列表对象是否作为数组对象的参数值占用Python中的内存?

时间:2019-06-17 12:53:49

标签: python arrays list memory

与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使用了要构造的列表。使用数组如何提高内存效率?

2 个答案:

答案 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,然后立即销毁。所以这里没什么大问题。