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

2024-04-20 13:01:03 发布

您现在位置:Python中文网/ 问答频道 /正文

这会释放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列表。我所需要的一切都是空的。你知道吗

有没有更优雅的方法?你知道吗


Tags: 内存inselfinfoobj列表forcreate
2条回答

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

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

对于python3.4,range不会创建任何列表,因此不会消耗太多内存。我运行了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相同的测试。结果和以前一样。记忆没有被释放。你知道吗

相关问题 更多 >