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
显然不是这样
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