衡量将整数附加到大型列表字典中的效率



我使用以下python代码来衡量将元素附加到大型列表字典的效率。这本词典有N词条。每个条目都是M整数的列表。所以我假设占用的内存是关于N * M * 4bytes的。如果N是100万,M是300,则1M * 300 * 4bytes,即1.2千兆字节。但令我惊讶的是,python的sys.getsizeof只报告了40兆字节的内存消耗。我哪里做错了?

import sys
import time
N=1000000
M=300
start = time.time()
d={}
for n in range(N):
d[n]=[]
for m in range(M):
d[n].append(m)

print ("Time elapsed in seconds = {}".format(time.time() - start))
print ("Size in Megabytes = {} ".format(sys.getsizeof(d)/1024.0/1024.0))

上面的代码报告了

Time elapsed in seconds = 54.5907461643219
Size in Megabytes = 40.00010681152344

那么,为什么报告的内存使用量是40兆字节,而不是1.2兆字节呢?

如果您阅读文档,它会显示:

只考虑直接归因于对象的内存消耗,而不考虑它所引用的对象的内存损耗。[…]有关递归使用getsizeof((查找容器及其所有内容的大小的示例,请参阅递归sizeof recipe。

所以,你得到的是容器(字典(的大小,而不是里面所有东西的大小。还有一个链接可以获得";递归的";大小为https://code.activestate.com/recipes/577504/

验证这一点的一种方法是;附加";作为阵列的一部分,您仍然可以获得40MB的大小。

最新更新