簡體   English   中英

Python - 列表的垃圾收集器

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM