是否需要在使用后立即删除python中的大变量?

时间:2014-08-14 08:41:41

标签: python garbage-collection

如果我创建一个1 GB的列表,将其打印到屏幕,然后将其删除,它是否也会从内存中删除?这种删除本质上就像释放内存,例如C中的free()。 但是有没有必要这样做,还是由python的垃圾收集处理?

原谅我,我不确定垃圾收集是如何工作的,但是如果变量太大,那么在使用它之后立即删除是否明智,而不是等待它被垃圾收集处理? (那就是它会吗?)

感谢。

# E.g. creating and deleting a large list

largeList = ['data', 'etc', 'etc'] # Continues to 1 GB
print largeList
largeList = []   # Or would it need to be:  del largeList [:]

2 个答案:

答案 0 :(得分:1)

大多数情况下,您不应该担心垃圾收集语言中的内存管理。这意味着删除变量(在python中)或手动调用垃圾收集器(GC)等操作。

你应该相信GC能够正常工作 - 大多数情况下,微管理内存会导致不良结果,因为GC有更多关于内存使用情况的信息和统计数据需要比你。此外,垃圾收集是一个昂贵的过程(以CPU为单位),所以很有可能你经常/在一个糟糕的时刻调用它。

在您的示例中发生的情况是,只要ỳoulargeList = [],之前引用的内存内容将在方便或需要内存时立即进行GC。

您可以使用解释器和内存监视器进行检查:

#5 MiB used
>>> l1=[0]*1024*1024*32
#261 MiB used
>>> l2=[0]*1024*1024*32
#525 MiB used
>>> l1=[0]*1024*1024*32
# 525 MiB used

非常罕见的情况, 需要手动管理内存,并关闭垃圾回收。当然,这可能导致内存泄漏错误such as this one。值得一提的是,现代的python GC可以正确处理循环引用。

答案 1 :(得分:0)

使用“die”--->删除名称将删除该名称与本地或全局名称空间的绑定。它肯定会释放内存,但并不释放所有内存。

注意:当一个进程从HEAP中释放一些内存时,它只在进程终止后才会释放回操作系统。

所以,最好留给垃圾收集器。