清空列表会释放Python中的内存吗?
这会释放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.
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没有释放未使用列表的内存的问题,这就是我找到答案的原因。