首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python是否为元组分配内存不足?

问Python是否为元组分配内存不足?
EN

Stack Overflow用户
提问于 2015-11-24 17:15:50
回答 1查看 72关注 0票数 2

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

代码语言:javascript
复制
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位机器上)时:

代码语言:javascript
复制
>>> show_sizeof(('a', 213))
 <type 'tuple'> 72 ('a', 213)
    <type 'str'> 38 a
    <type 'int'> 24 213

我看到为我的元组分配了72个字节,只使用了62个字节(= 38 + 24)。这说得通。但是,当我向元组添加另一个元素时,我会看到以下内容:

代码语言:javascript
复制
>>> 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个字节吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-24 17:17:48

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

元组对象由指向其他对象的指针组成。包括这些指针在内的整个元组占72个字节。这些指针是对也占用内存的对象的引用,这既不是这里也不是那里,这些对象本身并不是元组内存占用的一部分。

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

代码语言:javascript
复制
>>> import sys
>>> sys.getsizeof((None, None))
72
>>> sys.getsizeof(None)
16

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33899874

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档