logo

Zbiranje smeti v Pythonu

Odvoz smeti v Python je samodejni postopek, ki obravnava dodeljevanje in sprostitev pomnilnika, kar zagotavlja učinkovito uporabo pomnilnika. Za razliko od jezikov, kot je npr C oz C++ kjer mora programer ročno dodeliti in sprostiti pomnilnik Python samodejno upravlja pomnilnik prek dveh primarnih strategij:

  1. Štetje referenc
  2. Odvoz smeti

Štetje referenc

Python uporablja štetje referenc za upravljanje pomnilnika. Vsak objekt spremlja, koliko referenc kaže nanj. Ko število referenc pade na nič, tj. ne ostane nobena referenca, Python samodejno sprosti objekt. primer:

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

Izhod
2 3 2 

Pojasnilo:



  • x se na začetku sklicuje dvakrat (enkrat x enkrat getrefcount()).
  • Dodeljevanje y = x poveča število.
  • Nastavitev y = Brez odstrani eno referenco.

Težava s štetjem referenc

Štetje sklicev ne uspe v prisotnosti cikličnih sklicev, tj. objektov, ki se sklicujejo drug na drugega v ciklu. Tudi če nič drugega ne kaže nanje, njihovo število referenc nikoli ne doseže ničle. primer:

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

Izhod
3 3 

Pojasnilo:

  • x vsebuje in in in vsebuje x .
  • Tudi po brisanju x in in Python ne bo mogel sprostiti pomnilnika samo s štetjem referenc, ker se vsak še vedno sklicuje na drugega.

Zbiranje smeti za ciklične reference

Odvoz smeti je tehnika upravljanja pomnilnika, ki se uporablja v programskih jezikih za samodejno povrnitev pomnilnika, ki ni več dostopen ali ga aplikacija ne uporablja več. Za obdelavo takih krožnih referenc Python uporablja a Zbiralec smeti (GC) iz vgrajenega modula gc. Ta zbiralnik lahko zazna in očisti predmete, ki so vključeni v referenčne cikle.

Generacijsko zbiranje smeti

Pythonov Generation Garbage Collector je zasnovan za obravnavo cikličnih referenc. Organizira predmete v tri generacije glede na njihovo življenjsko dobo:

  • Generacija 0: Novo ustvarjeni objekti.
  • Generacija 1: Predmeti, ki so preživeli en zbirni cikel.
  • 2. generacija: dolgoživi predmeti.

Ko pride do referenčnih ciklov, jih zbiralnik smeti samodejno zazna in očisti ter sprosti pomnilnik.

Samodejno zbiranje smeti ciklov

Zbiranje smeti se samodejno zažene, ko število dodelitev preseže število sprostitev za določen prag. Ta prag je mogoče pregledati z uporabo modula gc.

Python
import gc print(gc.get_threshold()) 

Izhod
(2000 10 10) 

Pojasnilo: Vrne nabor pragov za generaciji 0 1 in 2. Ko dodelitve presežejo prag, se sproži zbiranje.

Ročno zbiranje smeti

Včasih je koristno ročno priklicati zbiralnik smeti, zlasti v primeru referenčnih ciklov. primer:

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) 

Izhod
0 10 

Pojasnilo:

  • def fun(i) ustvari ciklično referenco tako, da sama naredi referenco v slovarju.
  • gc.collect() sproži zbiranje smeti in shrani število zbranih predmetov (na začetku 0).
  • za i v dosegu (10) klice zabava(i) 10-krat ustvarjanje 10 cikličnih referenc.
  • gc.collect() znova sproži zbiranje smeti in natisne število zbranih ciklov.

Vrste ročnega zbiranja smeti

  • Časovno odvoz smeti: Zbiralnik smeti se sproži v določenih časovnih intervalih.
  • Zbiranje smeti na podlagi dogodkov: Zbiralnik smeti se pokliče kot odgovor na določene dogodke, na primer ko uporabnik zapusti aplikacijo ali ko aplikacija postane nedejavna.

Prisilni odvozi smeti

Pythonov zbiralnik smeti (GC) se zažene samodejno, da počisti neuporabljene predmete. Če ga želite vsiliti ročno, uporabite gc.collect() iz modula gc. primer:

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

Pojasnilo:

  • od a b c izbriše sklicevanja na a b in c zaradi česar so upravičeni do odvoza smeti.
  • gc.collect() prisili zbiranje smeti, da sprosti pomnilnik s čiščenjem nereferenciranih objektov.

Onemogočanje zbiranja smeti

V Pythonu se zbiralnik smeti samodejno zažene, da očisti nereferencirane predmete. Če želite preprečiti njegovo delovanje, ga lahko onemogočite z gc.disable() iz modula gc. primer:

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

Pojasnilo:

  • gc.disable() onemogoči samodejno zbiranje smeti.
  • gc.enable() ponovno omogoči samodejno zbiranje smeti.

Interakcija z zbiralnikom smeti Python

Vgrajeni mehanizem, imenovan Python garbage collector, samodejno odstrani objekte, na katere se ne sklicuje več, da sprosti pomnilnik in ustavi uhajanje pomnilnika. Modul Python gc ponuja številne načine za interakcijo z zbiralnikom smeti, ki se pogosto izvaja samodejno.

1. Omogočanje in onemogočanje zbiralnika smeti: Zbiralnik smeti lahko omogočite ali onemogočite z uporabo gc. omogoči () in gc. onemogoči() funkcije oz. Primer :

združevanje nizov
Python
import gc # Disable  gc.disable() # Enable gc.enable() 

2. Prisilno zbiranje smeti: Zbiranje smeti lahko sprožite ročno z uporabo gc. zbirati () funkcijo. To je lahko uporabno v primerih, ko želite vsiliti takojšnje zbiranje smeti, namesto da čakate, da se izvede samodejno zbiranje smeti.  primer:

Python
import gc gc.collect() 

3. Pregled nastavitev zbiralnika smeti: Trenutne nastavitve zbiralnika smeti lahko pregledate z uporabo gc.get_threshold() funkcija, ki vrne zbirko, ki predstavlja trenutne pragove za generaciji 0 1 in 2.  primer:

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

Izhod
(2000 10 10) 

4. Nastavitev pragov zbiralnika smeti: Pragove za zbiranje smeti lahko nastavite z uporabo gc.set_threshold() funkcijo. To vam omogoča, da ročno prilagodite pragove za različne generacije, kar lahko vpliva na pogostost zbiranja smeti.  primer:

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

Izhod
(500 5 5) 

Prednosti in slabosti 

Raziščimo nekaj prednosti in slabosti Pythonovega zbiranja smeti.

Prednosti

Slabosti

Samodejno upravljanje pomnilnika

Lahko povzroči dodatne stroške glede zmogljivosti

Brez ročnega ravnanja s pomnilnikom

Zahteva razumevanje konceptov spomina

Učinkovito čiščenje skozi generacije

Omejen nadzor nad časom GC

Prilagodljive nastavitve GC

Možnost napak ali uhajanja pomnilnika

Ustvari kviz