将在Python中清空列表释放内存?

时间:2016-01-26 12:03:14

标签: python memory-management

这会在Python中释放内存吗?

a = range(200)
a = []

或者我必须专门做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))

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

有更优雅的方式吗?

1 个答案:

答案 0 :(得分:3)

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

对于Python 3.4 a = range(1000000000000)不会创建任何列表 - 所以它不会消​​耗太多内存。我已经运行了a = [x for x in range(10000000)]并且几乎没有因内存消耗而改变 但后来我运行了200 MB并消耗了a = [],然后运行a = [x for x in range(10000000)]并释放了内存。再次创建del a,它花费了200 MB,然后Select * from NPM.EH_MODEM_HIST_PRFRM_FACT subpartition(SYS_SUBP1256625); 并释放了内存。

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

PS。
我在Python2.6中运行与Python3.4相同的测试。结果和以前一样。内存发布。