清空列表会释放Python中的内存吗?

清空列表会释放Python中的内存吗?,python,memory-management,Python,Memory Management,这会释放Python中的内存吗 a = range(200) a = [] 或者我必须专门做dela SPORTS = ['cricket', 'football'] def handle(self, *args, **options): logger = logging.getLogger('load_articles') for sport in self.SPORTS: logger.info('setting sport') self.

这会释放Python中的内存吗

a = range(200)
a = []
或者我必须专门做
dela

SPORTS = ['cricket', 'football']

def handle(self, *args, **options):
    logger = logging.getLogger('load_articles')
    for sport in self.SPORTS:
        logger.info('setting sport')
        self.sport = sport
        self.load_articles_in_mem() #this populates the array articles
        obj, created = self.create_sport()
        self.create_articles_for(obj)
        self.articles = []
    logger.info("Articles loaded in memory %s" % len(self.articles))
因此,这里的文章从某个来源加载到内存中,随着我增加
SPORTS
列表,我会不断增加
articles
列表。一旦我需要的一切都完成了,我就可以清空循环中的列表


有没有更优雅的方法可以做到这一点?

它应该释放内存,因为不会引用列表中的对象。但据我所知,Python解释器并不能保证这一点。

它应该释放内存,因为不会引用列表中的对象。但据我所知,Python解释器并不能保证这一点。

我刚刚检查了Python2.6并创建了
a=range(100000000)
它消耗了高达
700MB的内存。然后
a=[]
它消耗了额外的
600 MB
内存
1.3 GB的总和
。然后
dela
什么也没有改变。在我关闭Python控制台后,内存被释放

对于Python3.4,range
不会创建任何列表,因此不会消耗太多内存。我运行了
a=range(1000000000000)
,内存消耗几乎没有变化。
但随后我运行了
a=[x代表范围内的x(10000000)]
,它消耗了大约
200MB
,然后运行
a=[]
,内存被释放。再次创建
a=[x代表范围内的x(10000000)]
并花费了200 MB,然后
dela
并释放内存

结论:
Py26不会对未使用列表进行垃圾收集。Py27也一样。(刚刚选中)
Py34将垃圾收集未使用的列表并释放内存


PS.

我在Python2.6中运行了与Python3.4相同的测试。结果和之前一样。内存没有被释放。

我刚刚检查了Python2.6,并创建了
a=range(100000000)
它消耗了700 MB的内存。然后
a=[]
它消耗了额外的
600 MB
内存
1.3 GB的总和
。然后
dela
什么也没有改变。在我关闭Python控制台后,内存被释放

对于Python3.4,range
不会创建任何列表,因此不会消耗太多内存。我运行了
a=range(1000000000000)
,内存消耗几乎没有变化。
但随后我运行了
a=[x代表范围内的x(10000000)]
,它消耗了大约
200MB
,然后运行
a=[]
,内存被释放。再次创建
a=[x代表范围内的x(10000000)]
并花费了200 MB,然后
dela
并释放内存

结论:
Py26不会对未使用列表进行垃圾收集。Py27也一样。(刚刚选中)
Py34将垃圾收集未使用的列表并释放内存


PS.

我在Python2.6中运行了与Python3.4相同的测试。结果和之前一样。内存未释放。

为什么不创建一个庞大的列表,记录RAM使用情况,运行下一行并比较RAM使用情况?您不是清空a,而是创建一个新列表并将名称a绑定到它。范围(200)将被垃圾收集(如果没有其他引用的话)。因此,由于我正在创建一个新的列表,旧的引用仍然会被GCed。是吗?为什么不简单地创建一个巨大的列表,记录RAM使用情况,运行下一行并比较RAM使用情况?您不是清空a,而是创建一个新列表并将名称a绑定到它。范围(200)将被垃圾收集(如果没有其他引用的话)。因此,由于我正在创建一个新的列表,旧的引用仍然会被GCed。是吗?
a=range(10**8),a=[]
在此python.exe之后仍保留2,4GB内存。一些人被释放了,但不是所有人。在重新分配a之前,它是3,2GB。在Python3中,它似乎释放了内存,尽管我认为
a=[]
delA
之间应该没有区别。如果仍然没有释放内存,您可以尝试强制垃圾收集,请参见
a=range(10**8),a=[]
在此python.exe仍然保留2,4 Gb内存之后。一些人被释放了,但不是所有人。在重新分配a之前,它是3,2GB。在Python3中,它似乎释放了内存,尽管我认为
a=[]
delA
之间应该没有区别。如果内存仍然没有释放,您可以尝试强制垃圾收集,请看我还遇到了Python2.7没有释放未使用列表的内存的问题,这就是我找到答案的原因。我还遇到了Python2.7没有释放未使用列表的内存的问题,这就是我找到答案的原因。