在下面所示的函数中,我想在使用完
x
后清除其在内存中的值。def f(x, *args):
# do something
y = g(x) # here i want to use x as argument and clear value of x from ram
# do something
我尝试过以下方式并使用memory_profiler
检查了内存使用情况,但都没起作用:
del x
x = None
我尝试的示例代码:
%%file temp.py
import lorem
@profile
def f(x, use_none=True):
# do something
y = g(x)
if use_none:
x = None
else:
del x
# do something
def g(x):
n = len(x)
return [lorem.paragraph() * i for i in range(n)]
if __name__ == '__main__':
x = g([1] * 1000)
# f(x, True)
f(x, False)
memory_profiler
命令:
python -m memory_profiler temp.py
结果(使用None
):
Filename: temp.py
Line # Mem usage Increment Line Contents
================================================
3 187.387 MiB 187.387 MiB @profile
4 def f(x, use_none=True):
5 # do something
6 340.527 MiB 153.141 MiB y = g(x)
7 340.527 MiB 0.000 MiB if use_none:
8 340.527 MiB 0.000 MiB x = None
9 else:
10 del x
结果(使用del
):
Filename: temp.py
Line # Mem usage Increment Line Contents
================================================
3 186.723 MiB 186.723 MiB @profile
4 def f(x, use_none=True):
5 # do something
6 338.832 MiB 152.109 MiB y = g(x)
7 338.832 MiB 0.000 MiB if use_none:
8 x = None
9 else:
10 338.832 MiB 0.000 MiB del x
编辑 全局删除和gc.collect()无效
Filename: temp.py
Line # Mem usage Increment Line Contents
================================================
4 188.953 MiB 188.953 MiB @profile
5 def f(x, use_none=True):
6 # do something
7 342.352 MiB 153.398 MiB y = g(x)
8 342.352 MiB 0.000 MiB if use_none:
9 x = None
10 globals()['x'] = None
11 gc.collect()
12 else:
13 342.352 MiB 0.000 MiB del x
14 342.352 MiB 0.000 MiB del globals()['x']
15 342.352 MiB 0.000 MiB gc.collect()
另外,我只是为了参考编写了这段代码, 在我的实际代码中,我会多次从一个函数调用到另一个函数,并且有时根据一些参数值和 x 的操作结果再次从内部调用相同的函数。
在每次调用之后,我想要在某些操作之后删除 x。
del y
,这样可以释放50%的内存。因为它持有对列表的引用。 - knh190