【发布时间】:2020-07-23 23:48:24
【问题描述】:
在试图弄清楚 Python 的垃圾收集系统是如何工作的时,我偶然发现了这个奇怪的东西。运行这个简单的代码:
import numpy as np
from memory_profiler import profile
@profile
def my_func():
a = np.random.rand(1000000)
a = np.append(a, [1])
a = np.append(a, [2])
a = np.append(a, [3])
a = np.append(a, [4])
a = np.append(a, [5])
b = np.append(a, [6])
c = np.append(a, [7])
d = np.append(a, a)
return a
if __name__ == '__main__':
my_func()
在我的 MacBook 上使用 memory_profiler 版本 0.52 和 Python 3.7.6,我得到以下输出:
Line # Mem usage Increment Line Contents
================================================
4 54.2 MiB 54.2 MiB @profile
5 def my_func():
6 61.8 MiB 7.7 MiB a = np.random.rand(1000000)
7 69.4 MiB 7.6 MiB a = np.append(a, [1])
8 69.4 MiB 0.0 MiB a = np.append(a, [2])
9 69.4 MiB 0.0 MiB a = np.append(a, [3])
10 69.4 MiB 0.0 MiB a = np.append(a, [4])
11 69.4 MiB 0.0 MiB a = np.append(a, [5])
12 69.4 MiB 0.0 MiB b = np.append(a, [6])
13 77.1 MiB 7.6 MiB c = np.append(a, [7])
14 92.3 MiB 15.3 MiB d = np.append(a, a)
15
16 92.3 MiB 0.0 MiB return a
有两件事很奇怪。首先,为什么第 7 行的内存增加比第 8-11 行更明显?其次,为什么第 12 行没有像第 13 行一样增加内存?
请注意,如果我删除第 12-14 行,我仍然会在第 7 行中获得内存的增加。所以这不是第 12 行内存实际增加的错误,而是 memory_profiler 错误地显示第 7 行的增加。
【问题讨论】:
标签: python numpy memory-profiling