为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕勒3428872 2021-04-26 16:40:43
我创建了两个列表l1和l2,但是每个列表都有不同的创建方法:import sysl1 = [None] * 10l2 = [None for _ in range(10)]print('Size of l1 =', sys.getsizeof(l1))print('Size of l2 =', sys.getsizeof(l2))但是输出使我感到惊讶:Size of l1 = 144Size of l2 = 192使用列表推导创建的列表在内存中更大,但是在Python中这两个列表是相同的。这是为什么?这是CPython内部的东西,还是其他解释?
查看完整描述

3 回答

?
慕的地8271018

TA贡献1796条经验 获得超4个赞

当您编写时[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个元素时不得不重新分配。


查看完整回答
反对 回复 2021-05-11
?
守着一只汪

TA贡献1872条经验 获得超3个赞

没有一个是内存块,但是它不是预先指定的大小。除此之外,数组元素之间的数组还有一些额外的间距。您可以通过运行以下命令自己查看:


for ele in l2:

    print(sys.getsizeof(ele))


>>>>16

16

16

16

16

16

16

16

16

16

它的总和不是l2的大小,而是更小。


print(sys.getsizeof([None]))

72

并且这远远大于的大小的十分之一l1。


您的数字应该有所不同,具体取决于您的操作系统的详细信息和操作系统中当前内存使用情况的详细信息。[None]的大小永远不能大于将变量设置为存储的可用相邻内存,并且如果以后将其动态分配为更大,则可能必须移动该变量。


查看完整回答
反对 回复 2021-05-11
  • 3 回答
  • 0 关注
  • 238 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信