【发布时间】: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