【问题标题】:Why does creating a list from a list make it larger?为什么从列表创建列表会使其变大?
【发布时间】:2016-10-02 14:53:06
【问题描述】:

在应该相同的列表上使用sys.getsizeof 时,我发现有些不一致。 (Python 2.7.5)

>>> lst = [0,1,2,3,4,5,6,7,8,9]
>>> sys.getsizeof(lst)
76
>>> lst2 = list(lst)
>>> sys.getsizeof(lst2)
104
>>> lst3 = list(lst2)
>>> sys.getsizeof(lst3)
104
>>> sys.getsizeof(lst[:])
76
>>> sys.getsizeof(lst2[:])
76

有人有简单的解释吗?

【问题讨论】:

  • 我有一个猜测,没有任何证据支持:列表提前分配了额外的内存,因此未来的 append 操作已经摊销了 O(1) 复杂性。也许大小的差异是因为额外分配的内存量不同。
  • @Kevin,你可能是正确的,因为使用 lst2 = lst[:] 返回相同的大小

标签: python list python-internals


【解决方案1】:

使用列表文字,VM 创建具有设定长度的列表。当将序列传递给list() 构造函数时,元素会被一一添加(通过list.extend()),因此列表会在适当时调整大小。由于resize operation 为了分摊成本而过度分配,最终列表通常会大于源列表。

【讨论】:

  • 您能否再解释一下以下内容? 由于调整大小操作为了分摊成本而过度分配,最终列表通常会大于源列表谢谢!
  • @Kasra:如果您添加 3 个空格但只填充其中 1 个空格,那么目标将比源多 2 个空格。
  • @IgnacioVazquez-Abrams 那么如果我们想要填充 4 个空间呢?我的意思是 python 是怎么做这个有风险的任务的?
  • @Kasra:一旦需要填充第四个空间,将分配 4 个额外的空间(假设),导致 4/7 的使用。
  • @IgnacioVazquez-Abrams ahan ...谢谢重播,我需要更多搜索!
【解决方案2】:

创建列表文字时,报告的大小是保存数据所需的最小大小。您可以看到这一点,因为如果附加单个元素,大小会增加。但是,当您使用 list 复制它时,它会分配一些额外的空间 - 在重新分配之前需要一些附加(在你的情况下,我怀疑第 8 个附加会做到这一点 - 每个元素需要 4 个更多字节)。这些分配行为不同可能是有原因的,但我不确定是什么原因。

【讨论】:

  • 感谢建议append 深入了解内部结构,非常有帮助。
猜你喜欢
  • 1970-01-01
  • 2021-11-12
  • 1970-01-01
  • 2020-01-18
  • 2016-10-20
  • 2021-04-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多