【发布时间】:2023-04-04 12:00:02
【问题描述】:
我有一个正在迭代的对象列表。
在每个循环之后,我想将该对象设置为 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?
【问题讨论】:
-
当你分配
None并且不存在其他引用时,对象将被自动标记为GC。您不必显式触发它。 -
@thefourtheye 是的,但是分配
a[i] = None会将元素 a[i] 设置为 None 但 object1 仍然存在。那是因为我本质上是在分配一个列表元素而不是对象。另外,这个question 有一条评论建议在每个循环后运行gc.collect()将运行时间提高 20%,所以我想尝试一下 -
您是对的,但是您通过将
None分配给列表索引来减少实际对象的引用计数。当您说a[i] = None时,如果a[i]处的对象具有引用计数1,那么它将变为0,因为a[i]不再引用该对象。因此,它将为 GC 做好准备。 -
@thefourtheye 啊啊啊啊这有道理!好的,您要添加它作为答案,我会接受吗?
标签: python list variable-assignment