logo

Zbieranie śmieci w Pythonie

Zbiórka śmieci W Pyton to automatyczny proces obsługujący alokację i dealokację pamięci, zapewniający efektywne wykorzystanie pamięci. W odróżnieniu od języków takich jak C Lub C++ gdzie programista musi ręcznie przydzielać i zwalniać pamięć, Python automatycznie zarządza pamięcią za pomocą dwóch podstawowych strategii:

  1. Liczenie referencji
  2. Zbiórka śmieci

Liczenie referencji

Używa Pythona liczenie referencji zarządzać pamięcią. Każdy obiekt śledzi, ile odniesień do niego wskazuje. Kiedy liczba odniesień spadnie do zera, tj. nie pozostaną żadne odniesienia, Python automatycznie zwalnia obiekt. Przykład:

Python
import sys x = [1 2 3] print(sys.getrefcount(x)) y = x print(sys.getrefcount(x)) y = None print(sys.getrefcount(x)) 

Wyjście
2 3 2 

Wyjaśnienie:



  • X odwołuje się początkowo dwukrotnie (raz przez x, raz przez getrefcount()).
  • Przypisywanie y = x zwiększa liczbę.
  • Ustawienie y = Brak usuwa jedno odniesienie.

Problem z liczeniem referencji

Zliczanie odniesień kończy się niepowodzeniem w przypadku odniesień cyklicznych, tj. obiektów, które odwołują się do siebie w cyklu. Nawet jeśli nic innego na nie nie wskazuje, ich liczba referencyjna nigdy nie osiąga zera. Przykład:

Python
import sys x = [1 2 3] y = [4 5 6] x.append(y) y.append(x) print(sys.getrefcount(x)) print(sys.getrefcount(y)) 

Wyjście
3 3 

Wyjaśnienie:

  • X zawiera I I I zawiera X .
  • Nawet po usunięciu X I I Python nie będzie w stanie zwolnić pamięci poprzez samo zliczanie odwołań, ponieważ każde z nich nadal odwołuje się do drugiego.

Zbiórka śmieci dla referencji cyklicznych

Zbiórka śmieci to technika zarządzania pamięcią stosowana w językach programowania w celu automatycznego odzyskiwania pamięci, która nie jest już dostępna lub nie jest używana przez aplikację. Do obsługi takich odwołań cyklicznych Python używa a Zbieracz śmieci (GC) z wbudowanego modułu gc. Kolektor ten jest w stanie wykryć i oczyścić obiekty biorące udział w cyklach referencyjnych.

Pokoleniowe zbieranie śmieci

Generacyjny moduł zbierający śmieci w Pythonie został zaprojektowany do obsługi odwołań cyklicznych. Organizuje obiekty w trzy generacje w oparciu o ich żywotność:

  • Generacja 0: Nowo utworzone obiekty.
  • Generacja 1: Przedmioty, które przetrwały jeden cykl zbierania.
  • Generacja 2: Obiekty długowieczne.

Gdy wystąpią cykle odniesienia, moduł zbierający elementy bezużyteczne automatycznie je wykrywa i czyści, zwalniając pamięć.

Automatyczne zbieranie śmieci w cyklach

Odśmiecanie uruchamia się automatycznie, gdy liczba alokacji przekracza liczbę dezalokacji o określony próg. Próg ten można sprawdzić za pomocą modułu gc.

Python
import gc print(gc.get_threshold()) 

Wyjście
(2000 10 10) 

Wyjaśnienie: Zwraca krotkę progową dla generacji 0 1 i 2. Kiedy alokacje przekraczają próg, uruchamiane jest zbieranie.

Ręczny odbiór śmieci

Czasami korzystne jest ręczne wywołanie modułu zbierającego elementy bezużyteczne, szczególnie w przypadku cykli referencyjnych. Przykład:

Python
import gc # Create a cycle def fun(i): x = {} x[i + 1] = x return x # Trigger garbage collection c = gc.collect() print(c) for i in range(10): fun(i) c = gc.collect() print(c) 

Wyjście
0 10 

Wyjaśnienie:

  • zdecydowanie zabawne(i) tworzy odniesienie cykliczne, tworząc samo odniesienie do słownika.
  • gc.collect() wyzwala wyrzucanie elementów bezużytecznych i przechowuje liczbę zebranych obiektów (początkowo 0).
  • dla i w zasięgu(10) dzwoni zabawa 10 razy tworząc 10 cyklicznych odniesień.
  • gc.collect() ponownie uruchamia zbieranie śmieci i wyświetla liczbę zebranych cykli.

Rodzaje ręcznego zbierania śmieci

  • Odśmiecanie na podstawie czasu: Moduł zbierający elementy bezużyteczne jest uruchamiany w ustalonych odstępach czasu.
  • Odśmiecanie oparte na zdarzeniach: Moduł zbierający elementy bezużyteczne jest wywoływany w odpowiedzi na określone zdarzenia, takie jak zamknięcie aplikacji przez użytkownika lub przejście aplikacji w stan bezczynności.

Przymusowa zbiórka śmieci

Moduł zbierający elementy bezużyteczne (GC) Pythona działa automatycznie w celu oczyszczenia nieużywanych obiektów. Aby wymusić to ręcznie, użyj gc.collect() z modułu gc. Przykład:

Python
import gc a = [1 2 3] b = {'a': 1 'b': 2} c = 'Hello world!' del abc gc.collect() 

Wyjaśnienie:

  • z abc usuwa odniesienia do a b I C dzięki czemu kwalifikują się do odbioru śmieci.
  • gc.collect() wymusza wyrzucanie elementów bezużytecznych w celu zwolnienia pamięci poprzez czyszczenie obiektów, do których nie istnieją odniesienia.

Wyłączanie zbierania śmieci

W Pythonie moduł zbierający elementy bezużyteczne działa automatycznie w celu oczyszczenia obiektów, do których nie istnieją odniesienia. Aby zapobiec jego uruchomieniu, możesz go wyłączyć za pomocą gc.disable() z modułu gc. Przykład:

Python
import gc gc.disable() gc.enable() 

Wyjaśnienie:

  • gc.disable() wyłącza automatyczne zbieranie śmieci.
  • gc.enable() ponownie włącza automatyczne zbieranie śmieci.

Interakcja z modułem wyrzucania elementów bezużytecznych w Pythonie

Wbudowany mechanizm zwany modułem zbierającym elementy bezużyteczne w Pythonie automatycznie eliminuje obiekty, do których nie ma już odniesień, aby zwolnić pamięć i zapobiec wyciekom pamięci. Moduł gc języka Python oferuje wiele sposobów interakcji z modułem zbierającym elementy bezużyteczne, który często jest uruchamiany automatycznie.

1. Włączanie i wyłączanie modułu zbierającego elementy bezużyteczne: Możesz włączyć lub wyłączyć moduł zbierający elementy bezużyteczne za pomocą gc. włączać() I gc. wyłączyć() funkcje odpowiednio. Przykład :

łączenie się z bazą danych w Javie
Python
import gc # Disable  gc.disable() # Enable gc.enable() 

2. Wymuszanie zbierania śmieci: Możesz ręcznie uruchomić wyrzucanie elementów bezużytecznych za pomocą gc. zbierać() funkcjonować. Może to być przydatne w przypadkach, gdy chcesz wymusić natychmiastowe odśmiecanie zamiast czekać na automatyczne odśmiecanie.  Przykład:

Python
import gc gc.collect() 

3. Sprawdzanie ustawień modułu zbierającego elementy bezużyteczne: Możesz sprawdzić bieżące ustawienia modułu zbierającego elementy bezużyteczne za pomocą gc.get_threshold() funkcja, która zwraca krotkę reprezentującą bieżące progi dla generacji 0 1 i 2.  Przykład:

Python
import gc t = gc.get_threshold() print(t) 

Wyjście
(2000 10 10) 

4. Ustawianie progów modułu zbierającego elementy bezużyteczne: Możesz ustawić progi zbierania elementów bezużytecznych za pomocą gc.set_threshold() funkcjonować. Umożliwia to ręczne dostosowanie progów dla różnych generacji, co może mieć wpływ na częstotliwość zbierania śmieci.  Przykład:

Python
import gc gc.set_threshold(500 5 5) t = gc.get_threshold() print(t) 

Wyjście
(500 5 5) 

Zalety i wady 

Przyjrzyjmy się niektórym zaletom i wadom wyrzucania elementów bezużytecznych w Pythonie.

Zalety

Wady

Automatyczne zarządzanie pamięcią

Może wprowadzić narzut wydajności

Brak ręcznej obsługi pamięci

Wymaga zrozumienia pojęć związanych z pamięcią

Skuteczne sprzątanie przez pokolenia

Ograniczona kontrola nad czasem GC

Konfigurowalne ustawienia GC

Możliwość wystąpienia błędów lub wycieków pamięci

Utwórz quiz