为什么两个相同的列表具有不同的内存占用量?

我创建了两个列表l1和l2,但是每个列表都有不同的创建方法:


import sys


l1 = [None] * 10

l2 = [None for _ in range(10)]


print('Size of l1 =', sys.getsizeof(l1))

print('Size of l2 =', sys.getsizeof(l2))

但是输出使我感到惊讶:


Size of l1 = 144

Size of l2 = 192

使用列表推导创建的列表在内存中更大,但是在Python中这两个列表是相同的。


这是为什么?这是CPython内部的东西,还是其他解释?


慕勒3428872
浏览 239回答 3
3回答

慕的地8271018

当您编写时[None] * 10,Python知道它将需要一个正好包含10个对象的列表,因此它会精确地分配该对象。当您使用列表推导时,Python并不知道它将需要多少。因此,随着元素的添加,列表逐渐增加。对于每个重新分配,它分配的空间都超过了立即需要的空间,因此不必为每个元素重新分配。结果列表可能会比所需的要大一些。比较具有相似大小的列表时,您会看到此行为:>>> sys.getsizeof([None]*15)184>>> sys.getsizeof([None]*16)192>>> sys.getsizeof([None for _ in range(15)])192>>> sys.getsizeof([None for _ in range(16)])192>>> sys.getsizeof([None for _ in range(17)])264您可以看到第一种方法只分配需要的东西,而第二种则周期性地增长。在此示例中,它为16个元素分配了足够的内存,并且在达到第17个元素时不得不重新分配。

守着一只汪

没有一个是内存块,但是它不是预先指定的大小。除此之外,数组元素之间的数组还有一些额外的间距。您可以通过运行以下命令自己查看:for ele in l2:    print(sys.getsizeof(ele))>>>>16161616161616161616它的总和不是l2的大小,而是更小。print(sys.getsizeof([None]))72并且这远远大于的大小的十分之一l1。您的数字应该有所不同,具体取决于您的操作系统的详细信息和操作系统中当前内存使用情况的详细信息。[None]的大小永远不能大于将变量设置为存储的可用相邻内存,并且如果以后将其动态分配为更大,则可能必须移动该变量。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python