gpt4 book ai didi

python - Python 是否为元组分配不足的内存?

转载 作者:行者123 更新时间:2023-11-28 21:49:09 24 4
gpt4 key购买 nike

好吧,这个错误几乎可以肯定是我的而不是 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 字节吗???

最佳答案

您误解了输出。 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 个字节,只需要包含足够指针的内存空间即可。

关于python - Python 是否为元组分配不足的内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33899874/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com