Python memory_profiler: 内存使用量不加起来

Python memory_profiler: memory usages does not add up

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

这是怎么回事?

del a 实际上并没有删除对象,它只是将对象标记为未使用,但稍后只要垃圾收集器认为合适,它就会被删除。 b 足以让垃圾收集器立即将其删除,但对于 a

显然不是这样