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

Dee*_*eyi 1 python memory-management

这会释放 Python 中的内存吗?

a = range(200)
a = []
Run Code Online (Sandbox Code Playgroud)

还是我必须专门做del a

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))
Run Code Online (Sandbox Code Playgroud)

所以这里的文章从某个来源加载到内存中,当我增加SPORTS列表时,我会不断膨胀articles列表。一旦我需要的一切都完成了,我就可以清空循环内的列表。

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

Mar*_*rek 5

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

对于 Python 3.4range不会创建任何列表 - 所以它不会消​​耗太多内存。我已经运行a = range(1000000000000)并且几乎没有改变内存消耗。
但后来我跑了a = [x for x in range(10000000)],它消耗了大约200 MB然后运行a = []和内存被释放。再次创建a = [x for x in range(10000000)],占用了 200 MB,然后del a释放了内存。

结论:
Py26 不会垃圾回收未使用的列表。Py27 也一样。(刚刚检查)
Py34 将垃圾收集未使用的列表并释放内存。


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