如果我创建一个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 [:]
答案 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中释放一些内存时,它只在进程终止后才会释放回操作系统。
所以,最好留给垃圾收集器。