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
Odpowiedz
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ć.
Nie wierzę, że CPython kiedykolwiek zwalnia pamięć z powrotem do systemu operacyjnego, nawet po jej odzyskaniu. – martineau
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
Nie jestem pewien, jak inaczej to powiedzieć: "CPython natychmiast odzyska pamięć, nie trzeba czekać na uruchomienie garbage collectora". –
"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.
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
Dlaczego programiści są tak zafascynowani szybkością rzeczy, które nie mają wpływu na ogólną prędkość programu? :) –
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
- 1. Python: Czy jest jakaś różnica między "del a" i "del (a)"?
- 2. Python print statement "Błąd składniowy: nieprawidłowa składnia"
- 3. CallableStatement kontra Statement
- 4. mysql IF Else Statement
- 5. Java Switch Statement
- 6. sqlplus print running statement
- 7. SQlite concat select statement
- 8. Obudowa w Select Statement
- 9. Optymalizacja SQL Case statement
- 10. Przełącznik/case statement
- 11. SQL Select Statement Where
- 12. Jinja2 If Statement
- 13. switch statement without break
- 14. Switch Statement in C#
- 15. JavaScript switch statement
- 16. Schemat let statement
- 17. if statement integer
- 18. Wyjście powłoki rury do polecenia svn del?
- 19. Gulp czyste/del zachowanie się zmieniło
- 20. Wykryj backspace i del na zdarzeniu "input"?
- 21. wolisz korzystania del lub realokacja None (zbieranie śmieci)
- 22. Jaka jest różnica między del a [:] a a = [], gdy chcę opróżnić listę o nazwie w python?
- 23. VB.NET Switch Statement GoTo Case
- 24. Ruby case statement na haszyszu?
- 25. Railsy RABL if else statement
- 26. switch-case statement bez przerw
- 27. Visual Case 6.0 Case Statement
- 28. szablon django if lub statement
- 29. Mysql CASE statement wiele kolumn
- 30. Jak korzystać z wtyczki Gulp powiadom z del?
Punkt zbierania śmieci jest to, że nie trzeba się martwić, gdy pamięć zostanie zwolniona . Więc dlaczego się o to martwisz? –
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