Colectarea gunoiului în Piton este un proces automat care se ocupă de alocarea și dealocarea memoriei, asigurând utilizarea eficientă a memoriei. Spre deosebire de limbi precum C sau C++ unde programatorul trebuie să aloce și să dealocați manual memoria Python gestionează automat memoria prin două strategii principale:
- Numărarea referințelor
- Colectarea gunoiului
Numărarea referințelor
Python folosește numărarea referințelor pentru a gestiona memoria. Fiecare obiect ține evidența câte referințe indică către el. Când numărul de referințe scade la zero, adică nu rămân referințe, Python dealoca automat obiectul. Exemplu:
Pythonimport sys x = [1 2 3] print(sys.getrefcount(x)) y = x print(sys.getrefcount(x)) y = None print(sys.getrefcount(x))
Ieșire
2 3 2
Explicaţie:
- x este referit de două ori inițial (o dată de x o dată de getrefcount()).
- Atribuire y = x crește numărul.
- Setare y = Nici unul elimină o referință.
Problemă cu numărarea referințelor
Numărarea referințelor eșuează în prezența referințelor ciclice, adică obiecte care se referă reciproc într-un ciclu. Chiar dacă nimic altceva nu le indică, numărul lor de referință nu ajunge niciodată la zero. Exemplu:
Pythonimport sys x = [1 2 3] y = [4 5 6] x.append(y) y.append(x) print(sys.getrefcount(x)) print(sys.getrefcount(y))
Ieșire
3 3
Explicaţie:
- x conţine şi şi şi conţine x .
- Chiar și după ștergere x şi şi Python nu va putea elibera memoria doar folosind contorizarea referințelor, deoarece fiecare se referă în continuare la celălalt.
Colectarea gunoiului pentru Referințe Ciclice
Colectarea gunoiului este o tehnică de gestionare a memoriei utilizată în limbajele de programare pentru a recupera automat memoria care nu mai este accesibilă sau utilizată de aplicație. Pentru a gestiona astfel de referințe circulare, Python folosește a Colector de gunoi (GC) din modulul gc încorporat. Acest colector este capabil să detecteze și să curețe obiectele implicate în ciclurile de referință.
Colectarea gunoaielor generaționale
Colectorul generațional de gunoi al Python este proiectat pentru a face față referințelor ciclice. Acesta organizează obiectele în trei generații în funcție de durata lor de viață:
- Generația 0: obiecte nou create.
- Generația 1: obiecte care au supraviețuit unui ciclu de colectare.
- Generația 2: obiecte cu viață lungă.
Când apar cicluri de referință, colectorul de gunoi le detectează automat și le curăță, eliberând memoria.
Colectarea automată a gunoiului de cicluri
Colectarea gunoiului rulează automat atunci când numărul de alocări depășește numărul de dealocari cu un anumit prag. Acest prag poate fi inspectat folosind modulul gc.
Pythonimport gc print(gc.get_threshold())
Ieșire
(2000 10 10)
Explicaţie: Returnează tuplul prag pentru generațiile 0 1 și 2. Când alocările depășesc pragul, colectarea este declanșată.
Colectarea manuală a gunoiului
Uneori este benefic să invocați manual colectorul de gunoi, mai ales în cazul ciclurilor de referință. Exemplu:
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)
Ieșire
0 10
Explicaţie:
- sigur distractiv(i) creează o referință ciclică făcând în sine o referință de dicționar.
- gc.collect() declanșează colectarea gunoiului și stochează numărul de obiecte colectate (inițial 0).
- pentru eu în rază (10) apeluri distracție (i) De 10 ori creând 10 referințe ciclice.
- gc.collect() declanșează din nou colectarea gunoiului și tipărește numărul de cicluri colectate.
Tipuri de colectare manuală a gunoiului
- Colectarea gunoiului în funcție de timp: Colectorul de gunoi este declanșat la intervale de timp fixe.
- Colectarea gunoiului pe bază de evenimente: Colectorul de gunoi este apelat ca răspuns la evenimente specifice, cum ar fi atunci când un utilizator iese din aplicație sau când aplicația devine inactivă.
Colectarea forțată a gunoiului
Colectorul de gunoi (GC) al lui Python rulează automat pentru a curăța obiectele neutilizate. Pentru a o forța manual, utilizați gc.collect() din modulul gc. Exemplu:
Pythonimport gc a = [1 2 3] b = {'a': 1 'b': 2} c = 'Hello world!' del abc gc.collect()
Explicaţie:
- din a b c șterge referințele la a b şi c făcându-i eligibili pentru colectarea gunoiului.
- gc.collect() forțează colectarea gunoiului să elibereze memorie prin curățarea obiectelor nereferite.
Se dezactivează colectarea gunoiului
În Python, colectorul de gunoi rulează automat pentru a curăța obiectele fără referință. Pentru a preveni rularea, îl puteți dezactiva folosind gc.disable() din modulul gc. Exemplu:
Pythonimport gc gc.disable() gc.enable()
Explicaţie:
- gc.disable() dezactivează colectarea automată a gunoiului.
- gc.enable() reactivează colectarea automată a gunoiului.
Interacționează cu colectorul de gunoi Python
Un mecanism încorporat numit colector de gunoi Python elimină automat obiectele care nu mai sunt referite pentru a elibera memorie și pentru a opri scurgerile de memorie. Modulul Python gc oferă o serie de moduri de a interacționa cu colectorul de gunoi, care este adesea executat automat.
1. Activarea și dezactivarea colectorului de gunoi: Puteți activa sau dezactiva colectorul de gunoi folosind gc. permite() şi gc. dezactivați() respectiv funcţii. Exemplu :
Linux rulează cmdPython
import gc # Disable gc.disable() # Enable gc.enable()
2. Forțarea colectării gunoiului: Puteți declanșa manual o colectare a gunoiului folosind gc. colecta() funcţie. Acest lucru poate fi util în cazurile în care doriți să forțați colectarea imediată a gunoiului în loc să așteptați să aibă loc colectarea automată a gunoiului. Exemplu:
Pythonimport gc gc.collect()
3. Inspectarea setărilor colectorului de gunoi: Puteți inspecta setările curente ale colectorului de gunoi folosind gc.get_threshold() funcție care returnează un tuplu reprezentând pragurile curente pentru generațiile 0 1 și 2. Exemplu:
Pythonimport gc t = gc.get_threshold() print(t)
Ieșire
(2000 10 10)
4. Setarea pragurilor colectoarelor de gunoi: Puteți seta pragurile pentru colectarea gunoiului folosind gc.set_threshold() funcţie. Acest lucru vă permite să ajustați manual pragurile pentru diferite generații, ceea ce poate afecta frecvența colectării gunoiului. Exemplu:
Pythonimport gc gc.set_threshold(500 5 5) t = gc.get_threshold() print(t)
Ieșire
(500 5 5)
Avantaje și dezavantaje
Să explorăm câteva dintre beneficiile și dezavantajele colectării de gunoi de la Python.
Avantaje | Dezavantaje |
|---|---|
Gestionarea automată a memoriei | Poate introduce costul general de performanță |
Fără manipulare manuală a memoriei | Necesită înțelegerea conceptelor de memorie |
Curățare eficientă prin generații | Control limitat asupra sincronizarii GC |
Setări GC personalizabile | Posibilitatea de bug-uri sau scurgeri de memorie |