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:
- Brojanje referenci
- 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:
Pythonimport 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:
Pythonimport 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.
Pythonimport 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:
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)
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:
Pythonimport 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:
Pythonimport 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 intPython
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:
Pythonimport 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:
Pythonimport 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:
Pythonimport 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 |