作者 | 豌豆花下猫
来源 | Python猫(ID:python_cat)
我之前的一篇文章,带大家揭晓了 Python 在给内置对象分配内存时的 5 个奇怪而有趣的小秘密。文中使用了sys.getsizeof
来计算内存,但是用这个方法计算时,可能会出现意料不到的问题。
文档中关于这个方法的介绍有两层意思:
该方法用于获取一个对象的字节大小(bytes)
它只计算直接占用的内存,而不计算对象内所引用对象的内存
也就是说,getsizeof 并不是计算实际对象的字节大小,而是计算“占位对象”的大小。如果你想计算所有属性以及属性的属性的大小,getsizeof 只会停留在第一层,这对于存在引用的对象,计算时就不准确。
例如列表 [1,2],getsizeof 不会把列表内两个元素的实际大小算上,而只是计算了对它们的引用。举一个形象的例子,我们把列表想象成一个箱子,把它存储的对象想象成一个个球,现在箱子里有两张纸条,写上了球 1 和球 2 的地址(球不在箱子里),getsizeof 只是把整个箱子称重(含纸条),而没有根据纸条上地址,找到两个球一起称重。
计算的是什么?
我们先来看看列表对象的情况: