【问题标题】:Why is there a discrepancy in memory size with these 3 ways of creating a list? [duplicate]为什么这 3 种创建列表的方法在内存大小上存在差异? [复制]
【发布时间】:2019-09-03 13:23:51
【问题描述】:
sys.getsizeof(list(range(10))) # 200
sys.getsizeof([0,1,2,3,4,5,6,7,8,9]) # 144
sys.getsizeof([i for i in range(10)]) # 192

我的 C 经验很少,所以这可能超出了我的想象,但我很好奇,因为我正在玩 sys.getsizeof

我试图查看文档,但我只找到了这个:

getsizeof() 调用对象的 sizeof 方法,如果对象由垃圾收集器管理,则会增加额外的垃圾收集器开销。

由于我很少有C 的经验,我对 GC 也不太熟悉,但是从我与 Python 相关的 GC 阅读中,我知道在 Python 中只计算引用。在上述情况下,我们没有将其保存到变量中,所以我假设没有 GC 引用?

【问题讨论】:

  • 通过文字,Python 确切地知道它需要为结果列表分配多少内存。对于另外两个,在列表构造函数实际迭代range 对象之前,不会知道所需的内存。我不确定list 和列表理解之间的 8 字节差异代表什么。
  • 骗子应该澄清你的大部分反对意见。 TL;DR:列表是一种“不断增长的”数据结构,其中包含一些逻辑,告诉它在每次插入时需要重新分配多少。在某些情况下,python 可以分配 exact 大小而无需迭代地扩大列表,这将导致 getsizeof 报告“尚未使用但已分配”的空间

标签: python python-3.x


【解决方案1】:

在使用list()range() 函数时,python 似乎分配了一些额外的内存。如果您使用[:] 将生成的数组中的值复制到一个新数组中,您可以看到它们变得相等。

示例:

import sys

sys.getsizeof(list(range(10))[:]) # 144
sys.getsizeof([0,1,2,3,4,5,6,7,8,9][:]) # 144
sys.getsizeof([i for i in range(10)][:]) # 144

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-02
    • 1970-01-01
    • 2015-08-29
    • 2020-09-15
    • 1970-01-01
    相关资源
    最近更新 更多