在IPython内存分析期间报告的奇怪增量值

时间:2017-11-25 21:58:05

标签: python ipython jupyter memory-profiling

在检查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

我认为没有错。上一个例子可能会发生什么?

0 个答案:

没有答案