【问题标题】:Does Python underallocate memory for tuples?Python 是否为元组分配了内存不足?
【发布时间】:2015-11-24 17:15:50
【问题描述】:

好吧,这个错误几乎肯定是我的,而不是 Python 的,但是我遇到了一些代码,可以用来显示为各种变量分配了多少内存,并看到了一个令人费解的结果。代码如下:

import sys

def show_sizeof(x, level=0):

    print "\t" * level, x.__class__, sys.getsizeof(x), x

    if hasattr(x, '__iter__'):
        if hasattr(x, 'items'):
            for xx in x.items():
                show_sizeof(xx, level + 1)
        else:
            for xx in x:
                show_sizeof(xx, level + 1)

它似乎接受一个变量,然后返回它的类、为其分配的内存量及其值。如果对象是可迭代对象,则此方法会在该可迭代对象的所有成员上递归调用自身。

现在当我尝试这个时(在我的 64 位机器上):

>>> show_sizeof(('a', 213))
 <type 'tuple'> 72 ('a', 213)
    <type 'str'> 38 a
    <type 'int'> 24 213

我看到已为我的元组分配了 72 个字节,但只使用了 62 个(= 38 + 24)。这是有道理的。但是,当我向元组添加另一个元素时,我看到了:

>>> show_sizeof(('a', 213, 1))
<type 'tuple'> 80 ('a', 213, 1)
     <type 'str'> 38 a
     <type 'int'> 24 213
     <type 'int'> 24 1

元组使用 80 个字节,但它的成员似乎需要 86 个字节(= 38 + 24 + 24)。元组不应该至少需要 86 个字节吗???

【问题讨论】:

    标签: python memory-management


    【解决方案1】:

    您误解了输出。 sys.getsizeof() 只报告对象本身的内存使用情况,从不报告它引用的任何对象。

    元组对象由指向其他对象的指针组成。整个元组,包括那些指针,占用 72 个字节。这些指针是对也占用内存的对象的引用,这些对象它们自己不属于元组的内存占用。

    请注意,Python 可以重用引用。例如,None 对象只有 一个 副本,但 (None, None) 元组仍然需要记录对该对象的两个引用。该元组仍然需要 72 字节的内存:

    >>> import sys
    >>> sys.getsizeof((None, None))
    72
    >>> sys.getsizeof(None)
    16
    

    (None, None) 元组所需的总内存为 72 + 16 字节。其他容器可以引用None 对象,但这些对象不必包含这 16 个字节,只需包含足够的指针的内存空间即可。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-19
      • 2014-05-11
      • 2015-08-15
      • 1970-01-01
      • 2017-01-07
      • 2011-01-11
      • 2014-02-18
      相关资源
      最近更新 更多