[英]Python - In-memory size of nested empty lists
可以使用sys.getsizeof
对象的内存大小。
可以预料, []
的大小小于[[]]
的大小。 在我的机器上,我得到以下尺寸:
>>> sys.getsizeof([])
36
>>> sys.getsizeof([[]])
40
现在,无论我拥有多少嵌套空列表,我总是得到相同的大小:
>>> sys.getsizeof([[[]]])
40
>>> sys.getsizeof([[[[]]]])
40
嵌套空列表的大小似乎有上边界的原因是什么?
大小只是指最外面的对象而不是嵌套的对象。 从getsizeof
的角度来看,对象大小只是对象的大小加上对象中包含的指针的大小而不是指向的对象。 您可以从以下内容中看到:
>>> import sys
>>> sys.getsizeof([])
64
>>> sys.getsizeof([[]])
72
>>> sys.getsizeof([[[]]])
72
>>> sys.getsizeof([[],[]])
80
>>> sys.getsizeof([[[]],[[]]])
80
如果要获得总内存占用量,则需要以递归方式查找对象的大小或使用其他内存分析。
此外,如果您正在编写自己的对象并希望getsizeof
正确返回大小,则可以实现自己的__sizeof__
方法。 例如:
import sys
class mylist:
def __init__(self, iterable):
self.data = list(iterable)
def __sizeof__(self):
return object.__sizeof__(self) + \
sum(sys.getsizeof(v) for v in self.__dict__.values()) + \
sum(sys.getsizeof(item) for item in self.data)
original_data = [[1,2,3], [1,2,3]]
print(sys.getsizeof(original_data))
foo = mylist(original_data)
print(sys.getsizeof(foo))
结果:
~/code_snippets$ python3 sizeof_list.py
80
336
阅读文档会告诉我,当调用getsizeof
,
仅考虑直接归因于对象的内存消耗,而不考虑它所引用的对象的内存消耗。
由于[]
是一个容器,因此根据getsizeof
,它的大小是它自己的大小加上它包含的引用的大小,而不是引用的对象的大小。
因此,如果[]
的大小为36
,参考的大小为4
,则[[]]
的大小为36+4
,因此为40
。
现在, [[[]]]
只不过是[x]
,其中x
是对[[]]
的引用。 因此, [[[]]]
的大小是[]
的大小加上参考的大小,所以也是40
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.