logo

Colectarea gunoiului în Python

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:

  1. Numărarea referințelor
  2. 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:

Python
import 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:

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)) 

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.

Python
import 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:

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) 

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:

Python
import 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:

Python
import 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ă cmd
Python
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:

Python
import 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:

Python
import 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:

Python
import 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

Creați un test