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:
- Liczenie referencji
- 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:
Pythonimport 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:
Pythonimport 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.
Pythonimport 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:
Pythonimport 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:
Pythonimport 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:
Pythonimport 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 JaviePython
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:
Pythonimport 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:
Pythonimport 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:
Pythonimport 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 |