pur*_*ity 5 python memory list

如图所示。50 000 000条记录只占用404M内存,为什么?由于一条记录占用 83 字节,因此 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
>>>
Run Code Online (Sandbox Code Playgroud)
sys.getsizeof只报告list本身的成本,不报告其内容。所以你看到了存储list对象头的成本,加上(多一点)50M 指针;您可能使用的是 64 位(八字节)指针系统,因此 50M 指针的存储空间约为 400 MB。获取真实大小需要sys.getsizeof为每个对象、每个对象的__dict__(如果适用)等递归调用,并且它不会是 100% 准确的,因为某些对象(例如小对象int)可能是共享的;这不是你想下去的兔子洞。