gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 17:23:15 26 4
gpt4 key购买 nike

我创建了两个列表 l1l2 ,但每个都有不同的创建方法:

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 内部的东西,还是其他一些解释?

最佳答案

当你写 [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 个元素时必须重新分配。

关于python - 为什么两个相同的列表有不同的内存占用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64719062/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com