【问题标题】:Difference in sizeof between a = [0] and a = [i for i in range(1)] [duplicate]a = [0] 和 a = [i for i in range(1)] 之间的 sizeof 差异 [重复]
【发布时间】:2019-11-07 15:46:57
【问题描述】:

我以两种不同的方式使用相同的元素创建了两个单独的列表 ab。为什么两个列表的大小有差异?

import sys
a = [0]
print(a)
>>> [0]
print(sys.getsizeof(a))
>>> 72

b = [i for i in range(1)]
print(b)
>>> [0]
print(sys.getsizeof(b))
>>> 96

【问题讨论】:

  • 您遇到了过度分配的问题。 Related
  • 也相关:stackoverflow.com/questions/51526242/… 我什至认为那是重复的。但是 TL:DR 列表文字将 udnerlying 缓冲区分配到保存该列表所需的确切长度,而 list-comphrenesion 本质上是使用 .append 进行 for 循环,这将使用过度分配。
  • 感谢@juanpa.arrivillaga 如此标记!
  • 另一个真正进入内部的相关问题:stackoverflow.com/questions/40018398/…

标签: python object memory memory-management sizeof


【解决方案1】:

当解释器看到a = [0]时,它知道它可以构建一个只有一个元素的列表。

当它执行列表推导时,它首先创建一个空列表,然后在执行过程中追加项目。它事先不知道列表会有多大,即使它正在迭代像range(1) 这样简单的东西。所以它试图猜测要分配多少内存,如果这还不够,它将不得不动态增加内存分配。这并不便宜,所以可以从一个大胆的猜测开始。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 2013-08-19
    • 2014-09-17
    • 1970-01-01
    相关资源
    最近更新 更多