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

标签 python list memory-management python-internals

我创建了两个列表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/51526242/

相关文章:

c++ - 您如何声明和使用重载的池运算符删除?

python - 如何在Python中计算彩色图片中白色和黑色像素的数量?如何使用 numpy 计算总像素

java - 在列表中查找字谜

python - 如何在Python中将嵌套列表拆分为多个列表?

python - 在 Python 中打印文件时如何对齐列

c - 为什么我的程序返回(空)和乱码而不是预期的输出

windows - 32 位和 64 位版本的 Windows 操作系统的页面大小是多少?

python - 在 Python 中访问列表

python - json.dumps 保证不丢失浮点精度吗?

python - UML 聚合可以是双向的吗?