为什么Python列表的内存使用量比预期的要小?

5

enter image description here

如图所示,5000万条记录只需要404M内存,这是为什么呢?因为每个记录占用83个字节,5000万条记录应该需要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
>>> 

有人和你有类似的问题,但是更深入一些,所以这是一个相关的主题:sys.getsizeof的深度版本 - metatoaster
1个回答

5

sys.getsizeof仅报告list本身的成本,而不是其内容。因此,您看到的是存储list对象头的成本,加上(略多于)50M个指针的成本; 您可能在64位(8字节)指针系统上,因此存储50M个指针需要约400 MB。要获取真正的大小,需要对每个对象、每个对象的__dict__(如果适用)等进行递归调用sys.getsizeof,并且它不会100%准确,因为一些对象(例如小的int)可能是共享的;这不是你想要深入探究的问题


是的。64位。我关心实际存储(获取列表内容)。这意味着如果一个列表有50000000条记录,那么所有相关存储实际上是3957+404 M吗? - purplecity
@purplecity:好的,你的记录是83个字节,再加上你要添加的字符串化“int”的长度,所以比那大一点,更像是4339 + 404 M,但是没错,大致正确。 - ShadowRanger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接