Šiukšlių surinkimas in Python yra automatinis procesas, kuris tvarko atminties paskirstymą ir atskyrimą, užtikrinant efektyvų atminties naudojimą. Skirtingai nuo kalbų, tokių kaip C arba C++ kai programuotojas turi rankiniu būdu paskirstyti atmintį ir ją išlaisvinti, Python automatiškai valdo atmintį naudodamas dvi pagrindines strategijas:
- Nuorodų skaičiavimas
- Šiukšlių surinkimas
Nuorodų skaičiavimas
Python naudoja nuorodų skaičiavimas valdyti atmintį. Kiekvienas objektas seka, kiek nuorodų nurodo į jį. Kai nuorodų skaičius nukrenta iki nulio, ty nuorodų nelieka, „Python“ automatiškai panaikina objekto vietą. Pavyzdys:
Pythonimport sys x = [1 2 3] print(sys.getrefcount(x)) y = x print(sys.getrefcount(x)) y = None print(sys.getrefcount(x))
Išvestis
2 3 2
Paaiškinimas:
- x iš pradžių nurodoma du kartus (kartą x vieną kartą naudojant getrefcount()).
- Priskyrimas y = x padidina skaičių.
- Nustatymas y = nėra pašalina vieną nuorodą.
Problema su nuorodų skaičiavimu
Nuorodų skaičiavimas nepavyksta, kai yra ciklinių nuorodų, t. y. objektų, kurie cikle nurodo vienas kitą. Net jei niekas kitas jų nenurodo, jų atskaitos skaičius niekada nepasiekia nulio. Pavyzdys:
Pythonimport sys x = [1 2 3] y = [4 5 6] x.append(y) y.append(x) print(sys.getrefcount(x)) print(sys.getrefcount(y))
Išvestis
3 3
Paaiškinimas:
- x yra ir ir ir yra x .
- Net ir ištrynus x ir ir Python negalės atlaisvinti atminties tik naudodamas nuorodų skaičiavimą, nes kiekvienas vis tiek nurodo kitą.
Šiukšlių rinkimas ciklinėms nuorodoms
Šiukšlių surinkimas yra atminties valdymo metodas, naudojamas programavimo kalbose automatiškai atgauti atmintį, kuri nebepasiekiama arba nebenaudojama programos. Norėdami tvarkyti tokias žiedines nuorodas, Python naudoja a Šiukšlių surinkėjas (GC) iš integruoto gc modulio. Šis kolektorius gali aptikti ir išvalyti objektus, susijusius su atskaitos ciklais.
Kartų šiukšlių rinkimas
Python's Generation Garbage Collector sukurtas ciklinėms nuorodoms tvarkyti. Ji suskirsto objektus į tris kartas pagal jų gyvavimo trukmę:
- 0 karta: naujai sukurti objektai.
- 1 karta: objektai, išgyvenę vieną rinkimo ciklą.
- 2 karta: ilgaamžiai objektai.
Kai atsiranda atskaitos ciklai, šiukšlių surinkėjas automatiškai aptinka ir išvalo juos, atlaisvindamas atmintį.
Automatinis dviračių šiukšlių surinkimas
Šiukšlių surinkimas vyksta automatiškai, kai paskirstymų skaičius tam tikra riba viršija paskirstymų skaičių. Šią slenkstį galima patikrinti naudojant gc modulį.
Pythonimport gc print(gc.get_threshold())
Išvestis
(2000 10 10)
Paaiškinimas: Jis grąžina 0 1 ir 2 kartų slenksčio eilutę. Kai paskirstymai viršija slenkstį, suaktyvinamas rinkimas.
Rankinis šiukšlių surinkimas
Kartais naudinga rankiniu būdu iškviesti šiukšlių surinkėją, ypač etaloninių ciklų atveju. Pavyzdys:
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)
Išvestis
0 10
Paaiškinimas:
- tikrai smagu (i) sukuria ciklinę nuorodą, darydamas žodyno nuorodą.
- gc.collect() suaktyvina šiukšlių surinkimą ir išsaugo surinktų objektų skaičių (iš pradžių 0).
- man diapazone (10) skambučių smagu (i) 10 kartų sukuriant 10 ciklinių nuorodų.
- gc.collect() vėl suaktyvina šiukšlių surinkimą ir išspausdina surinktų ciklų skaičių.
Rankinio šiukšlių surinkimo tipai
- Laiku pagrįstas šiukšlių surinkimas: Šiukšlių surinkėjas įjungiamas nustatytais laiko intervalais.
- Šiukšlių surinkimas pagal renginius: Šiukšlių surinkėjas iškviečiamas reaguojant į konkrečius įvykius, pvz., kai vartotojas išeina iš programos arba kai programa neveikia.
Priverstinis šiukšlių išvežimas
Python šiukšlių surinkėjas (GC) veikia automatiškai, kad išvalytų nenaudojamus objektus. Norėdami priversti jį rankiniu būdu, naudokite gc.collect() iš gc modulio. Pavyzdys:
Pythonimport gc a = [1 2 3] b = {'a': 1 'b': 2} c = 'Hello world!' del abc gc.collect()
Paaiškinimas:
- iš a b c ištrina nuorodas į a b ir c kad jie būtų tinkami šiukšlių išvežimui.
- gc.collect() verčia šiukšlių rinkimą atlaisvinti atmintį išvalant nenurodytus objektus.
Šiukšlių surinkimo išjungimas
Python sistemoje šiukšlių rinktuvas veikia automatiškai, kad išvalytų nenurodytus objektus. Kad jis neveiktų, galite jį išjungti naudodami gc.disable() iš gc modulio. Pavyzdys:
Pythonimport gc gc.disable() gc.enable()
Paaiškinimas:
- gc.disable() išjungia automatinį šiukšlių surinkimą.
- gc.enable() iš naujo įjungia automatinį šiukšlių surinkimą.
Bendravimas su python šiukšlių surinkėju
Integruotas mechanizmas, vadinamas Python šiukšlių surinkėju, automatiškai pašalina objektus, į kuriuos nebėra nuorodų, kad būtų atlaisvinta atmintis ir sustabdytas atminties nutekėjimas. Python gc modulis siūlo daugybę būdų, kaip bendrauti su šiukšlių surinkėju, kuris dažnai vykdomas automatiškai.
1. Šiukšlių surinkėjo įjungimas ir išjungimas: Galite įjungti arba išjungti šiukšlių surinkėją naudodami gc. įgalinti () ir gc. išjungti () funkcijas. Pavyzdys :
rūšiavimo masyvas javaPython
import gc # Disable gc.disable() # Enable gc.enable()
2. Priverstinis šiukšlių surinkimas: Galite rankiniu būdu suaktyvinti šiukšlių surinkimą naudodami gc. rinkti () funkcija. Tai gali būti naudinga tais atvejais, kai norite priverstinai išvežti šiukšles, o ne laukti automatinio šiukšlių surinkimo. Pavyzdys:
Pythonimport gc gc.collect()
3. Šiukšlių surinkėjo nustatymų tikrinimas: Galite patikrinti esamus šiukšlių surinkėjo nustatymus naudodami gc.get_threshold() funkcija, kuri grąžina eilutę, atspindinčią dabartines 0 1 ir 2 kartų slenksčius. Pavyzdys:
Pythonimport gc t = gc.get_threshold() print(t)
Išvestis
(2000 10 10)
4. Šiukšlių surinkėjo slenksčių nustatymas: Galite nustatyti šiukšlių surinkimo slenksčius naudodami gc.set_threshold() funkcija. Tai leidžia rankiniu būdu reguliuoti skirtingų kartų slenksčius, kurie gali turėti įtakos šiukšlių surinkimo dažnumui. Pavyzdys:
Pythonimport gc gc.set_threshold(500 5 5) t = gc.get_threshold() print(t)
Išvestis
(500 5 5)
Privalumai ir trūkumai
Panagrinėkime kai kuriuos Python šiukšlių surinkimo privalumus ir trūkumus.
Privalumai | Trūkumai |
|---|---|
Automatinis atminties valdymas | Gali pridėti našumo išlaidas |
Nėra rankinio atminties tvarkymo | Reikia suprasti atminties sąvokas |
Efektyvus valymas iš kartos į kartą | Ribota GC laiko kontrolė |
Pritaikomi GC nustatymai | Klaidų ar atminties nutekėjimo galimybė |