[英]Python - Garbage collector for list
我做了一個簡單的循環,對於每次迭代, append
一個數字append
到列表中。 程序完成后,列表使用的內存是否會自動釋放?
if __name__ == '__main__': for i in range(100000): list.append(i)
有人可以向我解釋一下嗎?
是的 ,程序終止時釋放所有內存。 在現代操作系統中,您無法保留內存,並且在進程終止時不會將其釋放。
垃圾收集器用於在程序終止之前釋放內存。 這種方式長時間運行的程序不會保留計算機的所有資源。
如果你有一個大數據結構,並且你希望垃圾收集器處理它(釋放它使用的內存),你應該在使用它之后刪除對它的所有引用。 在這種情況下,簡單的del list
就足夠了。
是的,當程序終止時將釋放內存,並且在大多數實現中,當該列表的引用計數達到零時,即當范圍中沒有指向該值的變量時,它也將被釋放。
您也可以使用gc模塊手動控制GC。
如果你只是遍歷列表並且列表足夠大以讓你擔心內存消耗,你可能應該檢查Python生成器和生成器表達式。
所以代替:
for i in range(100000):
results.append(do_something_with(i))
for result in results:
do_something_else_with(result)
你可以寫:
partial = (do_something_with(i) for i in range(100000))
for result in partial:
do_something_else_with(result)
要么:
def do_something(iterable):
for item in iterable:
yield some_calculation(item)
def do_something_else(iterable):
for item in iterable:
yield some_other_calculation(item)
partial = do_something(range(100000))
for result in do_something_else(partial):
print result
等等......這樣你就不必在內存中分配整個列表了。
是的,操作系統在終止后會小心並釋放進程使用的內存。 Python與它無關。
然而,Python本身具有自動垃圾收集,所以它釋放所有不再需要你的Python程序運行時的內存。
最后,您可能應該使用:
if __name__ == '__main__':
list = range(100000)
實現你所寫的完全相同的東西。
你不必擔心在python中釋放內存,因為這是程序的一個自動功能。 Python使用引用計數來管理內存,當不再引用某些內容時,python將自動相應地分配內存。 換句話說,刪除對列表的所有引用應該足以釋放分配給它的內存。
也就是說,如果您的程序很大,您可以使用gc.collect()
來使垃圾收集器釋放一些內存。 但是,這通常是不必要的,因為Python的垃圾收集器旨在完成其工作。
此外,雖然不建議這樣做,並且通常從來沒有gc.disable()
,但您也可以使用gc.disable()
禁用Python的自動垃圾收集器,這允許您作為用戶手動分配內存,采用幾乎C風格的方法。
所有內存將在終止后釋放,但如果您想在創建列表時有效,請在執行期間使用xrange
而不是生成數字。
alist = [i for i in xrange(10000)]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.