2013-02-19 53 views
14

上Python中的變量調用del。這是否立即釋放分配的內存或仍在等待垃圾收集器收集?像在java中一樣,顯式調用del對內存何時被釋放沒有影響。的Python del語句

+0

垃圾收集的一點是,你不必擔心,當內存被釋放約。那麼你爲什麼要擔心呢? – 2013-02-19 23:44:50

+0

我正在處理大量流量並觀察到內存泄漏問題。我幾乎可以肯定這個問題不在Python腳本中,而只是試圖確定。 – ninja 2013-02-20 01:26:48

回答

18

del語句不回收內存。它會刪除一個引用,該引用會減少該值的引用計數。如果計數爲零,則可以回收內存。 CPython會立即回收內存,不需要等待垃圾收集器運行。

實際上,只需要用於回收環狀結構的垃圾收集器。

由於瓦利德·汗說,在他的評論中,Python的內存管理只是工作,你不必擔心。

+1

我不相信CPython將內存釋放回操作系統,即使它被回收了。 – martineau 2013-02-20 00:38:38

+0

所以,當你說「如果計數爲零,內存可以回收」,你的意思是它仍然需要等待垃圾回收器「實際」回收或? – ninja 2013-02-20 01:28:15

+2

我不知道該怎麼說:「CPython會立即回收內存,不需要等待垃圾回收器運行。」 – 2013-02-20 02:04:49

2

「的名稱的缺失去那名從本地或全局命名空間的結合」。沒有更多,不少。它對名稱所指向的對象不做任何事情,除了減少它的refcount,並且如果refcount不爲零,即使GC運行時也不會收集對象。

1

此外,del語句似乎有點快於分配無(類似於Java的風格分配空一個變量來釋放它的內存...)。

比較:

import time, math 

def measure_del(): 
     start = time.time() 
     for i in range(0,int(math.pow(10,8))): 
        a = "123" 
        del a # <--- !!! 
     end = time.time() 
     print(end-start) 

def measure_none(): 
     start = time.time() 
     for i in range(0,int(math.pow(10,8))): 
        a = "123" 
        a = None # <--- !!! 
     end = time.time() 
     print(end-start) 

的結果(在idle3.4運行):

>>> measure_del() 
3.9930295944213867 
>>> measure_del() 
3.7402305603027344 
>>> measure_del() 
3.8423104286193848 
>>> measure_del() 
3.753770351409912 
>>> measure_del() 
3.7772741317749023 
>>> measure_del() 
3.815058946609497 

>>> measure_none() 
4.052351236343384 
>>> measure_none() 
4.130320072174072 
>>> measure_none() 
4.082390069961548 
>>> measure_none() 
4.100180625915527 
>>> measure_none() 
4.071730375289917 
>>> measure_none() 
4.136169672
+0

爲什麼程序員如此着迷於與程序整體速度無關的事物速度? :) – 2018-02-19 17:38:15

+0

好吧,它就像一包紙。例如。您可以購買500克紙張,重量爲80克/平方米或90克/平方米。如果你在一張紙上寫,你幾乎不會注意到有什麼不同。但是如果你比較兩種包裝,你會發現身高,體重和價格有明顯的差異。編寫好的代碼,平衡代碼的可讀性和機器級別的性能當然不是一個壞主意。 – Barpfotenbaer 2018-03-07 12:55:24