2013-02-19 12 views
14

Wywołanie del dla zmiennej w języku Python. Czy to zwolni przydzieloną pamięć od razu, czy też wciąż czeka na zbieranie śmieci? Podobnie jak w Javie, jawne wywoływanie del nie ma wpływu na to, kiedy pamięć zostanie zwolniona.Python del statement

+0

Punkt zbierania śmieci jest to, że nie trzeba się martwić, gdy pamięć zostanie zwolniona . Więc dlaczego się o to martwisz? –

+0

Przetwarzam duży ruch i obserwuję problemy z wyciekami pamięci. Jestem prawie pewien, że problem nie leży w skrypcie pythona, ale próbuję się upewnić. – ninja

Odpowiedz

18

Instrukcja del nie odzyskuje pamięci. Usuwa odniesienie, które zmniejsza wartość odniesienia na wartości. Jeśli liczba wynosi zero, pamięć może zostać odzyskana. CPython natychmiast odzyska pamięć, nie trzeba czekać na uruchomienie garbage collectora.

W rzeczywistości, garbage collector jest potrzebny tylko do odzyskiwania cyklicznych struktur.

Jak mówi Waleed Khan w swoim komentarzu, zarządzanie pamięcią w Pythonie po prostu działa, nie musisz się tym martwić.

+1

Nie wierzę, że CPython kiedykolwiek zwalnia pamięć z powrotem do systemu operacyjnego, nawet po jej odzyskaniu. – martineau

+0

Kiedy mówisz "Jeśli licznik jest zerowy, pamięć może zostać odzyskana.", Czy masz na myśli to, że musi jeszcze poczekać na "odzyskanie" śmieciarki lub? – ninja

+2

Nie jestem pewien, jak inaczej to powiedzieć: "CPython natychmiast odzyska pamięć, nie trzeba czekać na uruchomienie garbage collectora". –

2

"Usunięcie nazwy usuwa powiązanie tej nazwy z lokalną lub globalną przestrzenią nazw". Nie więcej nie mniej. Nie robi nic dla obiektu, którego nazwa wskazuje, z wyjątkiem zmniejszania jego refcount, a jeśli refcount nie jest zerem, obiekt nie zostanie zebrany, nawet gdy działa GC.

1

Również del oświadczeniewydaje się być trochę szybciej niż przypisywania Brak (podobny do stylu Java przypisanie wartości null do zmiennej, aby zwolnić pamięć ...).

Dla porównania:

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) 

wyniki w (uruchomiony w 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

Dlaczego programiści są tak zafascynowani szybkością rzeczy, które nie mają wpływu na ogólną prędkość programu? :) –

+0

Cóż, to coś w rodzaju paczki papieru. Na przykład. można kupić 500 arkuszy o gramaturze 80 g/m² lub 90 g/m². Jeśli napiszesz na jednym arkuszu, prawie nie zauważysz różnicy. Ale jeśli porównasz oba pakiety, zobaczysz wyraźną różnicę w wysokości, wadze i cenie. Pisząc dobry kod, z pewnością nie jest złym pomysłem zrównoważenie czytelności kodu z wydajnością na poziomie maszyny. – Barpfotenbaer