我有一个包含单个类中的大对象的大型列表:
my_list = [ LargeClass() for i in xrange(10000)]
我需要将列表的一部分复制到一个辅助列表中,但是为了节省内存,我想在原始列表中用一堆替换那个片段:
new_list = my_list[:1000]
my_list[:1000] = [None] * 1000
我希望这会减少'my_list'使用的内存,所以我不带两个相同“数据”的副本。但是,这不会释放任何内存。调用垃圾收集器也没有任何区别。
有没有办法实现这个目标?
编辑:我应该提到第二个列表将作为参数传递给子进程(多处理),因此它将被复制。完成后,我不需要原始列表中的数据,这只是浪费内存。
答案 0 :(得分:2)
正如罗杰所说,你实际上并没有复制对象,而是复制了引用:
In [27]: mylist = [object() for i in range(10000)]
In [28]: newlist = mylist[:1000]
In [29]: mylist[0] is newlist[0]
Out[29]: True
is
检查对象是否相同(不仅仅是相同的,而是相同的)
如果要销毁对象,则需要删除对它们的所有引用;哪个(不是你想做的,但是)可以通过简单说明来完成:
mylist = mylist[:1000]
总而言之,我从来没有表现出需要使用Python的GC。对象足够小,我不在乎,或者如果它们是大规模(数百MB),那么它们似乎在短时间内被清除。 我的"问题"垃圾收集通常是我的代码中的问题,我有一个偷偷摸摸的参考,我没有清理。
答案 1 :(得分:0)
正如评论所说,你不能通过更改标签来释放内存,这样你就可以更好地删除你不想要的索引:
my_list[:1000] = []