logo

Skupljanje smeća u Pythonu

Odvoz smeća u Piton je automatski proces koji upravlja dodjelom i oslobađanjem memorije osiguravajući učinkovito korištenje memorije. Za razliku od jezika kao što su C ili C++ gdje programer mora ručno dodijeliti i osloboditi memoriju Python automatski upravlja memorijom kroz dvije primarne strategije:

  1. Brojanje referenci
  2. Odvoz smeća

Brojanje referenci

Python koristi brojanje referenci upravljati memorijom. Svaki objekt prati koliko referenci upućuje na njega. Kada broj referenci padne na nulu, tj. ne ostane nijedna referenca, Python automatski poništava objekt. Primjer:

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

Izlaz
2 3 2 

Obrazloženje:



  • x na početku se referencira dva puta (jednom x jednom getrefcount()).
  • Dodjeljivanje y = x povećava broj.
  • Postavka y = Ništa uklanja jednu referencu.

Problem s brojanjem referenci

Brojanje referenci ne uspijeva u prisutnosti cikličkih referenci, tj. objekata koji se međusobno referiraju u ciklusu. Čak i ako ništa drugo ne ukazuje na njih, njihov broj referenci nikad ne dosegne nulu. Primjer:

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

Izlaz
3 3 

Obrazloženje:

  • x sadrži i i i sadrži x .
  • Čak i nakon brisanja x i i Python neće moći osloboditi memoriju samo korištenjem brojanja referenci jer se svaki i dalje referira na drugi.

Skupljanje smeća za cikličke reference

Odvoz smeća je tehnika upravljanja memorijom koja se koristi u programskim jezicima za automatsko vraćanje memorije koja više nije dostupna ili koju aplikacija više ne koristi. Za rukovanje takvim kružnim referencama Python koristi a Skupljač smeća (GC) iz ugrađenog gc modula. Ovaj sakupljač može otkriti i očistiti objekte uključene u referentne cikluse.

Generacijsko odvoz smeća

Pythonov Generation Garbage Collector dizajniran je za rad s cikličkim referencama. Organizira objekte u tri generacije na temelju njihovog vijeka trajanja:

  • Generacija 0: Novostvoreni objekti.
  • Generacija 1: Predmeti koji su preživjeli jedan ciklus prikupljanja.
  • Generacija 2: dugovječni objekti.

Kada se dogode referentni ciklusi, skupljač smeća ih automatski otkriva i čisti oslobađajući memoriju.

Automatsko sakupljanje smeća ciklusa

Sakupljanje smeća pokreće se automatski kada broj dodjela premaši broj poništenja za određeni prag. Ovaj se prag može provjeriti pomoću gc modula.

Python
import gc print(gc.get_threshold()) 

Izlaz
(2000 10 10) 

Obrazloženje: Vraća torku praga za generacije 0 1 i 2. Kada dodjela premaši prag, pokreće se skupljanje praga.

Ručno odvoz smeća

Ponekad je korisno ručno pozvati sakupljač smeća, posebno u slučaju referentnih ciklusa. Primjer:

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) 

Izlaz
0 10 

Obrazloženje:

  • def fun(i) stvara cikličku referencu praveći samu rječničku referencu.
  • gc.collect() pokreće skupljanje smeća i pohranjuje broj prikupljenih objekata (u početku 0).
  • za ja u rasponu (10) poziva zabava(i) 10 puta stvarajući 10 cikličkih referenci.
  • gc.collect() ponovno pokreće skupljanje smeća i ispisuje broj prikupljenih ciklusa.

Vrste ručnog odvoza smeća

  • Skupljanje smeća temeljeno na vremenu: Sakupljač smeća pokreće se u fiksnim vremenskim intervalima.
  • Skupljanje smeća na temelju događaja: Skupljač otpada se poziva kao odgovor na određene događaje kao što je kada korisnik izađe iz aplikacije ili kada aplikacija postane neaktivna.

Prisilni odvoz smeća

Pythonov skupljač smeća (GC) pokreće se automatski kako bi očistio neiskorištene objekte. Da biste ga prisilili ručno, koristite gc.collect() iz gc modula. Primjer:

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

Obrazloženje:

  • od a b c briše reference na a b i c što ih čini podobnima za odvoz smeća.
  • gc.collect() prisiljava sakupljanje smeća da oslobodi memoriju čišćenjem nereferenciranih objekata.

Onemogućavanje sakupljanja smeća

U Pythonu skupljač smeća pokreće se automatski kako bi očistio nereferencirane objekte. Kako biste spriječili njegovo pokretanje, možete ga onemogućiti pomoću gc.disable() iz gc modula. Primjer:

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

Obrazloženje:

  • gc.disable() onemogućuje automatsko sakupljanje smeća.
  • gc.enable() ponovno omogućuje automatsko prikupljanje smeća.

Interakcija s python skupljačem smeća

Ugrađeni mehanizam koji se zove Python skupljač smeća automatski eliminira objekte koji se više ne referenciraju kako bi se oslobodila memorija i zaustavilo curenje memorije. Python gc modul nudi niz načina za interakciju sa skupljačem smeća koji se često automatski izvršava.

1. Omogućavanje i onemogućavanje sakupljača smeća: Možete omogućiti ili onemogućiti sakupljač smeća pomoću gc. omogućiti() i gc. onemogući() funkcije odnosno. Primjer :

strint na int
Python
import gc # Disable  gc.disable() # Enable gc.enable() 

2. Prisilno prikupljanje smeća: Možete ručno pokrenuti sakupljanje smeća pomoću gc. prikupiti() funkcija. Ovo može biti korisno u slučajevima kada želite nametnuti trenutno sakupljanje smeća umjesto da čekate da dođe do automatskog skupljanja smeća.  Primjer:

Python
import gc gc.collect() 

3. Provjera postavki skupljača smeća: Možete provjeriti trenutne postavke sakupljača smeća pomoću gc.get_threshold() funkcija koja vraća torku koja predstavlja trenutne pragove za generacije 0 1 i 2.  Primjer:

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

Izlaz
(2000 10 10) 

4. Postavljanje pragova skupljača smeća: Pragove za skupljanje smeća možete postaviti pomoću gc.set_threshold() funkcija. To vam omogućuje da ručno prilagodite pragove za različite generacije što može utjecati na učestalost odvoza smeća.  Primjer:

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

Izlaz
(500 5 5) 

Prednosti i nedostaci 

Istražimo neke od prednosti i nedostataka Pythonovog skupljanja smeća.

Prednosti

Nedostaci

Automatsko upravljanje memorijom

Može dovesti do povećanja performansi

Nema ručnog rukovanja memorijom

Zahtijeva razumijevanje koncepata pamćenja

Učinkovito čišćenje kroz generacije

Ograničena kontrola vremena GC-a

Prilagodljive GC postavke

Mogućnost grešaka ili curenja memorije

Napravi kviz