【问题标题】:Python - In-memory size of nested empty listsPython - 嵌套空列表的内存大小
【发布时间】:2016-12-25 05:03:58
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 你读过the documentation,特别是“只考虑直接归因于对象的内存消耗,而不考虑它所引用的对象的内存消耗”的部分吗?
  • @BrenBarn 实际上我没有,它回答了我的问题。谢谢!

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

    因此,如果[] 的大小为36,而引用的大小为4,则[[]] 的大小为36+4,因此40

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

    【讨论】:

      猜你喜欢
      • 2022-01-22
      • 2023-03-29
      • 2016-02-01
      • 2016-05-22
      • 2011-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多