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

时间:2016-12-25 05:03:59

标签: python python-3.x in-memory empty-list

对象的内存大小可以通过sys.getsizeof获得。

正如人们所预料的那样,[]的大小小于[[]]的大小。在我的机器上,我得到以下尺寸:

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

现在,无论我拥有多少嵌套空列表,我总是得到相同的大小:

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

嵌套空列表的大小似乎有上边界的原因是什么?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

阅读the documentation会告诉我,在致电getsizeof时,

  

只有直接归因于对象的内存消耗才是   占了,而不是它所指对象的内存消耗。

由于[]是一个容器,根据getsizeof,它的大小是它自己的大小加上它包含的引用的大小,而不是引用的对象的大小。

因此,如果[]的尺寸为36,且参考尺寸为4,则[[]]的尺寸为36+4,因此40

现在,[[[]]]只是[x],其中x是对[[]]的引用。因此,[[[]]]的大小是[]的大小加上引用的大小,因此也是40