2014-04-04 33 views
1

我有我正在迭代的对象列表。如何在列表中分配变量而不仅仅是列表元素? (for python)

每次循环后,我想将该对象设置为None并强制垃圾收集器运行。

但是我不知道如何分配对象而不是元素。例如:

a = [ object1, object2, object3] 

for i in xrange(0,len(a)]: 
     #do something with object 
     .... 
     #done working on object 
     a[i] = None <-- This sets element i to None and leaves the object intact. 

我试图这样做的原因是因为我正在使用机器学习库并遍历许多分类器。分类器记忆了大量的预测。因此,一旦我将预测写入CSV,我不再需要它们。这就是为什么在每个循环结束时,我希望删除分类器,然后运行gc.collect()并理想地改进内存管理。

所以问题是,我如何将对象分配给None?

+2

当您分配'None'并且不存在其他参考时,这些对象将自动标记为GC。你不必明确地触发它。 – thefourtheye

+0

@thefourtheye是的,但分配'a [i] = None'将元素a [i]设置为None,但object1仍然存在。这是因为我基本上分配一个列表元素而不是对象。此外,这[问题](http://stackoverflow.com/questions/1316767/how-can-i-explicitly-free-memory-in-python)有一个评论,建议在每个之后运行'gc.collect()'循环将运行时间提高20%,所以我想尝试一下 –

+2

你是对的,但是你正在通过给列表索引分配'None'来减少实际对象的引用计数。当你说'a [i] = None'时,如果'a [i]'处的对象的引用计数为'1',那么它将变为0,因为'a [i]'不再引用该对象。所以,它将为GC做好准备。 – thefourtheye

回答

0

正如评论说@thefourtheye:

当分配None和引用不存在,该对象将被自动标记为GC。你不必明确地触发它。

您正在通过将None分配给列表索引来减少实际对象的引用计数。当您说a[i] = None时,您将a[i]处的对象的引用计数减少1。如果它的引用计数为1,那么它将使其为0,并且由于没有任何内容不再引用该对象,因此它将准备好用于GC。

相关问题