在检查Jake van der Plas的“Python数据科学手册”时,我正在重新创建各种调试和分析工具的使用示例。他提供了一个使用以下函数演示%mprun
的示例:
def sum_of_lists(N):
total = 0
for i in range(5):
L = [j ^ (j >> i) for j in range(N)]
total += sum(L)
del L
return total
我继续在Jupyter笔记本中执行它,并得到以下输出:
Line # Mem usage Increment Line Contents
================================================
1 81.3 MiB 81.3 MiB def sum_of_lists(N):
2 81.3 MiB 0.0 MiB total = 0
3 81.3 MiB 0.0 MiB for i in range(5):
4 113.2 MiB -51106533.7 MiB L = [j ^ (j >> i) for j in range(N)]
5 119.1 MiB 23.5 MiB total += sum(L)
6 81.3 MiB -158.8 MiB del L
7 81.3 MiB 0.0 MiB return total
......这让我感到很奇怪。根据这本书,我应该在第4行获得25.4 MiB的增加,并在第6行获得相应的负增长。但我有一个巨大的负增量,而不是根本不符合我预期会发生的事情。 。根据第6行,应该有158.8的增量。
另一方面,Mem usage
描绘的是更明智的画面(113.2 - 81.3 =增加31.9 MiB)。所以我留下了一个奇怪的,巨大的负增量,并且内存使用的两个测量变化彼此不一致。那怎么回事呢?
只是为了检查我的解释器/分析器是否有一些真正奇怪的事情,我继续并复制了this answer中给出的示例,并得到了这个输出:
Line # Mem usage Increment Line Contents
================================================
2 86.5 MiB 86.5 MiB def my_func():
3 94.1 MiB 7.6 MiB a = [1] * (10 ** 6)
4 246.7 MiB 152.6 MiB b = [2] * (2 * 10 ** 7)
5 94.1 MiB -152.6 MiB del b
6 94.1 MiB 0.0 MiB return a
我认为没有错。上一个例子可能会发生什么?