【问题标题】:Measure the efficiency of appending integers to a large dictionary of lists测量将整数附加到大型列表字典的效率
【发布时间】:2021-02-03 02:28:57
【问题描述】:

我使用以下 python 代码来衡量将元素附加到大型列表字典的效率。字典有N 条目。每个条目都是M 整数的列表。所以我假设所占用的内存大约是N * M * 4bytes。如果N是100万,M是300,那么1M * 300 * 4bytes,也就是1.2G。但令我惊讶的是,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 MB,而不是 1.2 GB?

【问题讨论】:

  • 您是如何到达1.2 Gigabytes 的?好像错了
  • 1M*300*4byte=1.2 GB。有什么问题吗?
  • 另外,您假设每个 int 占用四个字节的内存空间是错误的。还有更多,因为将为每个对象创建一个 Python 对象。 sys.getsizeof(1) 在我的系统上返回 28。

标签: python performance memory


【解决方案1】:

如果您阅读文档,它会说:

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

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

验证这一点的一种方法是,如果您将“追加”部分删除到数组中,您仍将获得 40 MB 大小。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-17
    • 2017-11-15
    • 2020-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    相关资源
    最近更新 更多