如何删除python函数中的对象?

时间:2014-08-27 15:35:04

标签: python memory numpy scipy

我正在使用非常大的numpy / scipy数组,占用大量内存。假设我的代码如下所示:

def do_something(a):
  a = a / a.sum() #new memory is allocated
  #I don't need the original a now anylonger, how to delete it?
  #do a lot more stuff

#a = super large numpy array
do_something(a)
print a #still the same as originally (as passed by value)

所以我用一个巨大的numpy数组调用一个函数。然后该函数以某种方式处理数组,但原始对象仍保留在内存中。有没有办法释放函数内部的内存;删除引用不起作用。

2 个答案:

答案 0 :(得分:3)

你想要的是什么; Python只会在对数组对象的所有引用都消失后释放内存,并且您无法从函数中删除调用命名空间中的a引用。

相反,将您的问题分解为更小的步骤。使用一个函数在a上进行计算,然后删除a,然后调用另一个函数来完成其余的工作。

答案 1 :(得分:0)

Python使用简单的GC算法,基本上它有一个引用计数(它也有一个世代GC,但事实并非如此),这意味着每个对象的引用都会增加一个计数器,并且每个对象都超出范围减少范围。 只有在计数器达到0后才会释放内存。

所以当你引用那个对象时,它会继续记忆。

在你的情况下,do_something的调用者仍然有对象的引用,如果你希望这个变量消失,你可以减少该变量的范围。

如果您怀疑内存泄漏,可以设置DEBUG_LEAK标志并检查输出,更多信息请点击此处:https://docs.python.org/2/library/gc.html