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:
- Štetje referenc
- 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:
Pythonimport 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:
Pythonimport 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.
Pythonimport 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:
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)
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:
Pythonimport 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:
Pythonimport 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 nizovPython
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:
Pythonimport 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:
Pythonimport 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:
Pythonimport 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 |