Python memory_profiler:内存使用不加起来

时间:2017-01-11 15:35:40

标签: python memory-management memory-leaks memory-profiling

memory_profiler的documentation提供了一个简单示例,显示了由于创建和删除列表而导致的内存使用量变化。

from memory_profiler import profile

@profile
def my_func():
    a = [1] * (10 ** 6)
    b = [2] * (2 * 10 ** 7)
    del b
    return a

if __name__ == '__main__':
    my_func()

产生以下输出:

Line #    Mem usage  Increment   Line Contents
==============================================
     3                           @profile
     4      5.97 MB    0.00 MB   def my_func():
     5     13.61 MB    7.64 MB       a = [1] * (10 ** 6)
     6    166.20 MB  152.59 MB       b = [2] * (2 * 10 ** 7)
     7     13.61 MB -152.59 MB       del b
     8     13.61 MB    0.00 MB       return a

删除b时,会释放其内存使用量。我正在玩,并将示例更改为以下内容,我还删除了a

from memory_profiler import profile

@profile
def my_func():
    a = [1] * (10 ** 6)
    b = [2] * (2 * 10 ** 7)
    del a
    del b
    return None

if __name__ == '__main__':
    my_func()

然而,在这里,a的删除并没有伴随 - 因为我天真地期望 - 内存使用量的减少。事实上,似乎没有任何事情发生。

Line #    Mem usage    Increment   Line Contents
================================================
    12     25.1 MiB      0.0 MiB   @profile
    13                             def my_func():
    14     32.7 MiB      7.6 MiB       a = [1] * (10 ** 6)
    15    185.3 MiB    152.6 MiB       b = [2] * (2 * 10 ** 7)
    16    185.3 MiB      0.0 MiB       del a
    17     32.7 MiB   -152.6 MiB       del b
    18     32.7 MiB      0.0 MiB       return None

发生了什么事?

1 个答案:

答案 0 :(得分:1)

del a实际上并没有删除对象,它只是将对象标记为未使用,但只要垃圾收集器认为合适,它将在以后删除。 b足够大,可以让垃圾收集器立即删除它,但a显然不是这样。