系统相关
首页 > 系统相关> > python – 为什么两个相同的列表具有不同的内存占用?

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

作者:互联网

我创建了两个列表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内部的一些东西,还是其他一些解释?

解决方法:

当你写[无] * 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日时必须重新分配.

标签:python,list,memory-management,python-internals
来源: https://codeday.me/bug/20190925/1817553.html