这会在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
列表。一旦我需要的东西完成,我就可以清空循环中的列表。
有更优雅的方式吗?
答案 0 :(得分:3)
我刚刚检查了Python2.6并创建了a = range(100000000)
,它耗尽了700 MB
个RAM。然后a = []
它消耗了额外的600 MB
1.3 GB of RAM
个del 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相同的测试。结果和以前一样。内存不发布。