【发布时间】:2019-10-31 01:47:05
【问题描述】:
array.array 对象的内存占用比 Python 中的 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 使用了要构建的列表。如何使用数组更节省内存?
【问题讨论】:
-
虽然没有明确提及内存,但 python.org 将它们称为高效:docs.python.org/3/library/array.html 但我在许多其他帖子中读到数组占用的内存比列表少。
-
与数组相比,列表的内存开销会随着集合包含大量条目而减少。例如:每个集合 12345 个整数,您可以通过使用数组而不是列表来节省惊人的 0.016% 内存......所以我不会汗流浃背;>
-
@Exho 当您检查 list 大小时,您需要执行
sys.getsizeof([1,2,3,4,5])而不是sys.getsizeof(['l', [1,2,3,4,5]]) -
用于创建数组的列表可以在之后立即进行垃圾回收,因此它的内存使用只是暂时的。
sys.getsizeof()在这里测量两个不同的东西——对于数组,它是整个对象;对于列表,它只是引用列表,不包括单个元素的大小。 -
创建了一个列表对象,但由于它是匿名的,所以一旦
array完成它就可以进行垃圾回收。