【问题标题】:sys.getsizeof(list) returns less than the sum of its elementssys.getsizeof(list) 返回小于其元素的总和
【发布时间】:2015-05-05 08:05:44
【问题描述】:

我很好奇 - 为什么sys.getsizeof 调用返回的列表数字小于其元素的总和?

import sys
lst = ["abcde", "fghij", "klmno", "pqrst", "uvwxy"]
print("Element sizes:", [sys.getsizeof(el) for el in lst])
print("Sum of sizes: ", sum([sys.getsizeof(el) for el in lst]))
print("Size of list: ", sys.getsizeof(lst))

以上印刷品

Element sizes: [42, 42, 42, 42, 42]
Sum of sizes:  210
Size of list:  112

怎么会?

【问题讨论】:

  • 列表包含指针。这里的指针指向 4 个元素数组,但每个数组与主数组(视图)共享数据

标签: python list


【解决方案1】:

您正在获取实际列表对象的大小。由于列表对象存储指向对象的指针,因此它的内存大小必然不同于(并且小于)其元素的总和。

以此类推,这就像在 C 中获取指针数组的大小。

【讨论】:

    【解决方案2】:

    根据documentationsys.getsizeof 执行以下操作:

    以字节为单位返回对象的大小。对象可以是任何类型 目的。所有内置对象都将返回正确的结果,但这 不必像它一样适用于第三方扩展 具体实现。

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

    因此,只有内置对象中非常原始的类型才能真正获得准确的结果。即使对于内置容器类型,您通常也需要使用某种递归函数来查找容器(列表、字典等)的“总”大小。但请记住,python 列表实际上只是一个可调整大小的指针数组,因此从某种意义上说,它是一个准确的数字。

    但是,您正在寻找这样的东西:

    https://code.activestate.com/recipes/577504/

    另外,请注意:

    >>> sys.getsizeof(npArrayList[0])
    96
    >>> 
    

    每个 numpy 对象 - 或与此相关的任何对象 - 都有一些开销,当您将 np.array 分配为列表元素时,您会创建一个新对象,所以实际上,以下仅考虑数组内容,而不是整个对象的开销:

    >>> npArrayList[0].nbytes
    32
    

    【讨论】:

      【解决方案3】:

      一个numpy数组a的内存可以通过a.nbytes获取。

      sys.getsizeof 显示“仅直接归因于对象的内存消耗 [...],而不是它所引用的对象的内存消耗。” (根据文档)。在您的情况下,它不包含所有数据。用a.flags可以看到输出:

      C_CONTIGUOUS : True
      F_CONTIGUOUS : False
      OWNDATA : False
      WRITEABLE : True
      ALIGNED : True
      WRITEBACKIFCOPY : False
      UPDATEIFCOPY : False
      

      对于第一个数组,它是:

      C_CONTIGUOUS : True
      F_CONTIGUOUS : False
      OWNDATA : True
      WRITEABLE : True
      ALIGNED : True
      WRITEBACKIFCOPY : False
      UPDATEIFCOPY : False
      

      OWNDATA 字段为 False 解释了为什么 sys.getsizeof 仅输出 128 个字节。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-09
        • 1970-01-01
        • 2012-09-18
        • 1970-01-01
        相关资源
        最近更新 更多