【问题标题】:Why is the memory usage of a Python list smaller than expected?为什么 Python 列表的内存使用量小于预期?
【发布时间】:2019-06-11 04:59:01
【问题描述】:

如图所示。 50 000 000 条记录只占用 404M 内存,为什么?由于一条记录占用 83 Bytes,因此 50 000 000 条记录应占用 3967M 内存。

>>> import sys
>>> a=[]
>>> for it in range(5*10**7):a.append("miJ8ZNFG9iFqiQQohvyTWwqsij2rJCiZ7v"+str(it))
... 
>>> print(sys.getsizeof(a)/1024**2)
404.4306411743164
>>> print(sys.getsizeof("miJ8ZNFG9iFqiQQohvyTWwqsij2rJCiZ7v"))
83
>>> print(83*5*10**7/1024**2)
3957.7484130859375
>>> 

【问题讨论】:

标签: python list memory


【解决方案1】:

sys.getsizeof 仅报告list 本身的成本,而不是其内容。所以你看到了存储list 对象头的成本,加上(略高于)50M 指针;您可能使用 64 位(八字节)指针系统,因此 50M 指针的存储空间约为 400 MB。获得真实大小需要为每个对象调用sys.getsizeof,每个对象的__dict__(如果适用)等等,递归地,它不会100%准确,因为一些对象(例如小@987654327 @s) 可能是共享的; this is not a rabbit hole you want to go down.

【讨论】:

  • 是的。 64位。我关心实际存储(获取列表内容)。所以这意味着如果一个列表有 50 000 000 条记录。实际上所有相关的存储都是 3957 + 404 M?
  • @purplecity:嗯,你的记录是 83 个字节,加上你要添加的字符串化 int 的长度,所以比那个大一点,更像 4339 + 404 M,但是是的,大致正确。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-10
  • 2020-05-31
  • 2019-06-19
  • 1970-01-01
  • 2011-02-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多