Python - 嵌套空列表的内存大小

3

可以使用sys.getsizeof来获取对象在内存中的大小。

正如人们所预期的那样,[]的大小比[[]]的大小要小。在我的机器上,我得到了以下大小:

>>> sys.getsizeof([])
36
>>> sys.getsizeof([[]])
40

现在,无论我有多少个嵌套的空列表,它们的大小总是相同的:

>>> sys.getsizeof([[[]]])
40
>>> sys.getsizeof([[[[]]]])
40

为什么嵌套的空列表大小似乎有一个上限?

7
你读过文档了吗?特别是其中的一句话:“只计算与对象直接相关的内存消耗,而不计算它所引用的对象的内存消耗。” - BrenBarn
@BrenBarn 实际上我还没有,这回答了我的问题。谢谢! - Right leg
https://dev59.com/9HRB5IYBdhLWcg3w-789#30316760 - DhruvPathak
2个回答

4

尺寸只是指最外层的对象,而不是嵌套的对象。从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

3
阅读文档会告诉我,在调用getsizeof时,只有直接归因于对象的内存消耗被计算在内,而不包括它所引用的对象的内存消耗。
由于[]是一个容器,根据getsizeof,它的大小是它本身的大小加上它所包含的引用的大小,但不包括所引用的对象的大小。
因此,如果[]的大小为36,引用的大小为4,那么[[]]的大小就是36+4,即40
现在,[[[]]]实际上就是[x],其中x是对[[]]的引用。因此,[[[]]]的大小就是[]的大小加上一个引用的大小,也是40

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接