我刚刚运行了这些代码:
v = [1,2,'kite',100**100]
for x,y in enumerate(v):
print ("{} size is: {}".format(y,sys.getsizeof(v[x])))
print ("Total size is: {} ".format(sys.getsizeof(v)))
输出:
1 size is: 14
2 size is: 14
kite size is: 29
100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 size is: 102
Total size is: 52
>>>
v的大小的最后一个元素是102,总大小是52?即使没有最后一个元素,列表的前3个元素的总和仍大于总大小,我的问题是为什么? Python在列表中执行zip处理?
另一个奇怪的是,在这些输出之间;
v = [""]
for x,y in enumerate(v):
print ("{} size is: {}".format(y,sys.getsizeof(v[x])))
print ("Total size is: {} ".format(sys.getsizeof(v)))
v=[" "]
for x,y in enumerate(v):
print ("{} size is: {}".format(y,sys.getsizeof(v[x])))
print ("Total size is: {} ".format(sys.getsizeof(v)))
输出:
>>>
size is: 27
Total size is: 40
size is: 26
Total size is: 40
>>>
真的很奇怪,任何人都能解释一下发生了什么吗?
答案 0 :(得分:2)
来自documentation(我的大胆)(a):
仅考虑直接归因于的内存消耗,而不是其引用的对象的内存消耗。
因此v
不的大小包括它引用的元素的大小。
如果您将kite
更改为kites
,则 还会看到其大小增加但不大小为{{1} (我已在输出中用v
替换了您的大号以简化格式化):
100...00
这样想:
1 size is: 12
2 size is: 12
kite size is: 25
100...00 size is: 102
Total size is: 48
1 size is: 12
2 size is: 12
kites size is: 26
100...00 size is: 102
Total size is: 48
(a)如果您需要该信息,该页面还有一个指向进行递归大小计算的配方的链接。链接重复here以供引用,下面的代码重复,以使此答案更加独立。
将您的结构插入到该代码中会给出:
/ +-----+
| v | ref | -> 1
Size | | ref | -> 2
of v | | ref | -> 'kite'
| | ref | -> 100**100
\ +-----+
\___________________________/
Size of things referred
to by v
具有您的结构的代码如下所示。
48 <type 'list'> [1, 2, 'kites', 100...00L]
12 <type 'int'> 1
12 <type 'int'> 2
26 <type 'str'> 'kites'
102 <type 'long'> 100...00L
200
答案 1 :(得分:1)
这是因为您的“总大小”实际上是没有内容的列表结构的大小。因此,您可以在那里存储任何大小的对象,它不会改变您的“总大小”。您需要一个“递归”的getsizeof(),为此,请参阅此处:Python deep getsizeof list with contents?或此处:Deep version of sys.getsizeof