可以使用 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
关于Python - 嵌套空列表的内存大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41318803/