logo

Afvalinzameling in Python

Afvalinzameling in Python is een automatisch proces dat geheugentoewijzing en -deallocatie afhandelt, waardoor een efficiënt gebruik van geheugen wordt gegarandeerd. In tegenstelling tot talen zoals C of C++ waarbij de programmeur handmatig geheugen moet toewijzen en de toewijzing ervan ongedaan moet maken, beheert Python automatisch het geheugen via twee primaire strategieën:

  1. Referentie tellen
  2. Afvalinzameling

Referentie tellen

Python gebruikt referentie tellen om het geheugen te beheren. Van elk object wordt bijgehouden hoeveel verwijzingen ernaar verwijzen. Wanneer het aantal referenties naar nul daalt, d.w.z. er zijn geen referenties meer, maakt Python de toewijzing van het object automatisch ongedaan. Voorbeeld:

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

Uitvoer
2 3 2 

Uitleg:



  • X Er wordt aanvankelijk twee keer naar verwezen (een keer door x, een keer door getrefcount()).
  • Toewijzen y = x verhoogt het aantal.
  • Instelling y = Geen verwijdert één verwijzing.

Probleem met referentietelling

Het tellen van referenties mislukt in de aanwezigheid van cyclische referenties, dat wil zeggen objecten die in een cyclus naar elkaar verwijzen. Zelfs als niets anders daarop wijst, bereikt hun referentietelling nooit nul. Voorbeeld:

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

Uitvoer
3 3 

Uitleg:

  • X bevat En En En bevat X .
  • Zelfs na het verwijderen X En En Python zal het geheugen niet kunnen vrijmaken door alleen maar referentietellingen te gebruiken, omdat de ene nog steeds naar de andere verwijst.

Afvalinzameling voor Cyclische Referenties

Afvalinzameling is een geheugenbeheertechniek die in programmeertalen wordt gebruikt om automatisch geheugen terug te winnen dat niet langer toegankelijk of in gebruik is door de applicatie. Om dergelijke kringverwijzingen af ​​te handelen gebruikt Python a Afvalverzamelaar (GC) van de ingebouwde gc-module. Deze verzamelaar kan objecten die betrokken zijn bij referentiecycli detecteren en opruimen.

Generatieafvalinzameling

Python's Generational Garbage Collector is ontworpen om met cyclische referenties om te gaan. Het organiseert objecten in drie generaties op basis van hun levensduur:

  • Generatie 0: Nieuw gemaakte objecten.
  • Generatie 1: Objecten die één verzamelcyclus hebben overleefd.
  • Generatie 2: objecten met een lange levensduur.

Wanneer er referentiecycli optreden, detecteert de garbage collector deze automatisch en ruimt deze op, waardoor geheugen wordt vrijgemaakt.

Automatische afvalinzameling van cycli

De afvalinzameling wordt automatisch uitgevoerd wanneer het aantal toewijzingen het aantal deallocaties met een bepaalde drempel overschrijdt. Deze drempel kan worden geïnspecteerd met behulp van de gc-module.

Python
import gc print(gc.get_threshold()) 

Uitvoer
(2000 10 10) 

Uitleg: Het retourneert de drempelwaarde-tuple voor generaties 0, 1 en 2. Wanneer toewijzingen de drempelwaarde overschrijden, wordt de verzameling geactiveerd.

Handmatige afvalinzameling

Soms is het nuttig om de garbage collector handmatig aan te roepen, vooral in het geval van referentiecycli. Voorbeeld:

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) 

Uitvoer
0 10 

Uitleg:

  • zeker leuk(ik) creëert een cyclische verwijzing door zelf een woordenboekverwijzing te maken.
  • gc.collect() activeert de garbagecollection en slaat het aantal verzamelde objecten op (aanvankelijk 0).
  • voor ik binnen bereik(10) oproepen leuk(ik) 10 keer 10 cyclische referenties creëren.
  • gc.collect() activeert de afvalinzameling opnieuw en drukt het aantal verzamelde cycli af.

Soorten handmatige afvalinzameling

  • Op tijd gebaseerde afvalinzameling: De garbage collector wordt met vaste tijdsintervallen geactiveerd.
  • Op gebeurtenissen gebaseerde afvalinzameling: De garbage collector wordt aangeroepen als reactie op specifieke gebeurtenissen, zoals wanneer een gebruiker de applicatie afsluit of wanneer de applicatie inactief wordt.

Gedwongen afvalophaling

Python's garbage collector (GC) wordt automatisch uitgevoerd om ongebruikte objecten op te ruimen. Om het handmatig te forceren, gebruikt u gc.collect() uit de gc-module. Voorbeeld:

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

Uitleg:

  • uit de a b c verwijdert verwijzingen naar een b En C waardoor ze in aanmerking komen voor de afvalinzameling.
  • gc.collect() dwingt garbagecollection om geheugen vrij te maken door objecten zonder referentie op te ruimen.

Afvalinzameling uitschakelen

In Python wordt de garbage collector automatisch uitgevoerd om objecten zonder referentie op te ruimen. Om te voorkomen dat het wordt uitgevoerd, kunt u het uitschakelen met gc.disable() uit de gc-module. Voorbeeld:

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

Uitleg:

  • gc.disable() schakelt de automatische afvalinzameling uit.
  • gc.enable() schakelt automatische afvalinzameling opnieuw in.

Interactie met Python-garbagecollector

Een ingebouwd mechanisme genaamd de Python garbage collector elimineert automatisch objecten waarnaar niet langer wordt verwezen om geheugen vrij te maken en geheugenlekken te stoppen. De Python gc-module biedt een aantal manieren om te communiceren met de garbage collector, die vaak automatisch wordt uitgevoerd.

1. De garbage collector in- en uitschakelen: U kunt de garbage collector in- of uitschakelen met behulp van de gc. inschakelen() En gc. uitzetten() respectievelijk functies. Voorbeeld :

hernoem map linux
Python
import gc # Disable  gc.disable() # Enable gc.enable() 

2. Het forceren van afvalinzameling: U kunt handmatig een garbagecollection activeren met behulp van de gc. verzamelen() functie. Dit kan handig zijn in gevallen waarin u onmiddellijke afvalinzameling wilt forceren in plaats van te wachten tot de automatische afvalinzameling plaatsvindt.  Voorbeeld:

Python
import gc gc.collect() 

3. Instellingen van de afvalverzamelaar inspecteren: U kunt de huidige instellingen van de garbage collector inspecteren met behulp van de gc.get_threshold() functie die een tuple retourneert die de huidige drempelwaarden voor generaties 0 1 en 2 vertegenwoordigt.  Voorbeeld:

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

Uitvoer
(2000 10 10) 

4. Drempels voor afvalverzamelaars instellen: U kunt de drempelwaarden voor het ophalen van afval instellen met behulp van de gc.set_threshold() functie. Hierdoor kunt u de drempelwaarden voor verschillende generaties handmatig aanpassen, wat van invloed kan zijn op de frequentie van de afvalinzameling.  Voorbeeld:

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

Uitvoer
(500 5 5) 

Voordelen en nadelen 

Laten we enkele voor- en nadelen van Python's garbage collection onderzoeken.

Voordelen

Nadelen

Automatisch geheugenbeheer

Kan prestatie-overhead introduceren

Geen handmatige geheugenverwerking

Vereist begrip van geheugenconcepten

Efficiënt opruimen via generaties

Beperkte controle over de timing van GC

Aanpasbare GC-instellingen

Mogelijkheid van bugs of geheugenlekken

Quiz maken