可以使用sys.getsizeof
来获取对象在内存中的大小。
正如人们所预期的那样,[]
的大小比[[]]
的大小要小。在我的机器上,我得到了以下大小:
>>> sys.getsizeof([])
36
>>> sys.getsizeof([[]])
40
现在,无论我有多少个嵌套的空列表,它们的大小总是相同的:
>>> sys.getsizeof([[[]]])
40
>>> sys.getsizeof([[[[]]]])
40
为什么嵌套的空列表大小似乎有一个上限?
可以使用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
。