Atkritumu savākšana iekšā Python ir automātisks process, kas apstrādā atmiņas piešķiršanu un atdalīšanu, nodrošinot efektīvu atmiņas izmantošanu. Atšķirībā no tādām valodām kā C vai C++ kur programmētājam manuāli jāpiešķir un jāatdala atmiņa, Python automātiski pārvalda atmiņu, izmantojot divas galvenās stratēģijas:
- Atsauces skaitīšana
- Atkritumu savākšana
Atsauces skaitīšana
Python izmanto atsauces skaitīšana lai pārvaldītu atmiņu. Katrs objekts izseko, cik atsauču norāda uz to. Kad atsauču skaits nokrītas līdz nullei, t.i., atsauces nepaliek, Python automātiski atdala objektu. Piemērs:
Pythonimport sys x = [1 2 3] print(sys.getrefcount(x)) y = x print(sys.getrefcount(x)) y = None print(sys.getrefcount(x))
Izvade
2 3 2
Paskaidrojums:
- x sākotnēji ir norādīts divreiz (vienreiz ar x vienu reizi, izmantojot getrefcount()).
- Piešķiršana y = x palielina skaitu.
- Iestatījums y = nav noņem vienu atsauci.
Problēma ar atsauces skaitīšanu
Atsauces skaitīšana neizdodas, ja ir cikliskas atsauces, t.i., objekti, kas ciklā atsaucas viens uz otru. Pat ja nekas cits uz tiem nenorāda, viņu atsauces skaits nekad nesasniedz nulli. Piemērs:
Pythonimport sys x = [1 2 3] y = [4 5 6] x.append(y) y.append(x) print(sys.getrefcount(x)) print(sys.getrefcount(y))
Izvade
3 3
Paskaidrojums:
- x satur un un un satur x .
- Pat pēc dzēšanas x un un Python nevarēs atbrīvot atmiņu, tikai izmantojot atsauces skaitīšanu, jo katrs joprojām atsaucas uz otru.
Atkritumu savākšana cikliskām norādēm
Atkritumu savākšana ir atmiņas pārvaldības paņēmiens, ko izmanto programmēšanas valodās, lai automātiski atgūtu atmiņu, kas vairs nav pieejama vai ko lietojumprogramma neizmanto. Lai apstrādātu šādas apļveida atsauces, Python izmanto a Atkritumu savācējs (GC) no iebūvētā gc moduļa. Šis savācējs spēj atklāt un notīrīt objektus, kas iesaistīti atskaites ciklos.
Paaudžu atkritumu savākšana
Python's Generation Garbage Collector ir paredzēts, lai tiktu galā ar cikliskām atsaucēm. Tas organizē objektus trīs paaudzēs, pamatojoties uz to dzīves ilgumu:
- 0. paaudze: jaunizveidoti objekti.
- 1. paaudze: objekti, kas izturēja vienu savākšanas ciklu.
- 2. paaudze: objekti ar ilgu mūžu.
Kad notiek atsauces cikli, atkritumu savācējs automātiski nosaka un iztīra tos, atbrīvojot atmiņu.
Automātiska atkritumu savākšana
Atkritumu savākšana notiek automātiski, kad piešķīrumu skaits pārsniedz sadalīšanas skaitu par noteiktu slieksni. Šo slieksni var pārbaudīt, izmantojot gc moduli.
Pythonimport gc print(gc.get_threshold())
Izvade
(2000 10 10)
Paskaidrojums: Tas atgriež sliekšņa koridoru 0 1. un 2. paaudzēm. Ja piešķīrumi pārsniedz slieksni, tiek aktivizēta kolekcija.
Manuāla atkritumu savākšana
Dažreiz ir lietderīgi manuāli izsaukt atkritumu savācēju, īpaši atsauces ciklu gadījumā. Piemērs:
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)
Izvade
0 10
Paskaidrojums:
- noteikti jautri(i) izveido ciklisku atsauci, pats izveidojot atsauci vārdnīcā.
- gc.collect() aktivizē atkritumu savākšanu un saglabā savākto objektu skaitu (sākotnēji 0).
- priekš i diapazonā (10) zvani jautri (i) 10 reizes izveidojot 10 cikliskas atsauces.
- gc.collect() atkal aktivizē atkritumu savākšanu un izdrukā savākto ciklu skaitu.
Manuālās atkritumu savākšanas veidi
- Atkritumu savākšana atkarībā no laika: Atkritumu savācējs tiek iedarbināts noteiktos laika intervālos.
- Atkritumu savākšana pēc pasākumiem: Atkritumu savācējs tiek izsaukts, reaģējot uz konkrētiem notikumiem, piemēram, kad lietotājs aizver lietojumprogrammu vai lietojumprogramma kļūst dīkstāvē.
Piespiedu atkritumu izvešana
Python atkritumu savācējs (GC) darbojas automātiski, lai notīrītu neizmantotos objektus. Lai to piespiestu manuāli, izmantojiet gc.collect() no gc moduļa. Piemērs:
Pythonimport gc a = [1 2 3] b = {'a': 1 'b': 2} c = 'Hello world!' del abc gc.collect()
Paskaidrojums:
- no a b c dzēš atsauces uz a b un c padarot tos piemērotus atkritumu savākšanai.
- gc.collect() liek atkritumu savākšanai atbrīvot atmiņu, iztīrot neatsaucamos objektus.
Atspējot atkritumu savākšanu
Programmā Python atkritumu savācējs darbojas automātiski, lai notīrītu neatsaucamos objektus. Lai to novērstu, varat to atspējot, izmantojot gc.disable() no gc moduļa. Piemērs:
Pythonimport gc gc.disable() gc.enable()
Paskaidrojums:
- gc.disable() atspējo automātisko atkritumu savākšanu.
- gc.enable() atkārtoti iespējo automātisku atkritumu savākšanu.
Mijiedarbība ar pitona atkritumu savācēju
Iebūvētais mehānisms, ko sauc par Python atkritumu savācēju, automātiski novērš objektus, uz kuriem vairs nav atsauces, lai atbrīvotu atmiņu un apturētu atmiņas noplūdes. Python gc modulis piedāvā vairākus veidus, kā mijiedarboties ar atkritumu savācēju, kas bieži tiek izpildīts automātiski.
1. Atkritumu savācēja iespējošana un atspējošana: Varat iespējot vai atspējot atkritumu savācēju, izmantojot gc. iespējot () un gc. atspējot () funkcijas. Piemērs :
java apakšvirknes funkcijaPython
import gc # Disable gc.disable() # Enable gc.enable()
2. Piespiedu atkritumu savākšana: Varat manuāli aktivizēt atkritumu savākšanu, izmantojot gc. savākt () funkciju. Tas var būt noderīgi gadījumos, kad vēlaties veikt tūlītēju atkritumu savākšanu, nevis gaidīt automātisku atkritumu savākšanu. Piemērs:
Pythonimport gc gc.collect()
3. Atkritumu savācēja iestatījumu pārbaude: Jūs varat pārbaudīt pašreizējos atkritumu savācēja iestatījumus, izmantojot gc.get_threshold() funkcija, kas atgriež virkni, kas atspoguļo pašreizējos sliekšņus 0 1. un 2. paaudzēm. Piemērs:
Pythonimport gc t = gc.get_threshold() print(t)
Izvade
(2000 10 10)
4. Atkritumu savācēja sliekšņu iestatīšana: Varat iestatīt atkritumu savākšanas sliekšņus, izmantojot gc.set_threshold() funkciju. Tas ļauj manuāli pielāgot sliekšņus dažādām paaudzēm, kas var ietekmēt atkritumu savākšanas biežumu. Piemērs:
Pythonimport gc gc.set_threshold(500 5 5) t = gc.get_threshold() print(t)
Izvade
(500 5 5)
Priekšrocības un trūkumi
Izpētīsim dažas Python atkritumu savākšanas priekšrocības un trūkumus.
Priekšrocības | Trūkumi |
|---|---|
Automātiskā atmiņas pārvaldība | Var ieviest veiktspējas pieskaitāmās izmaksas |
Nav manuālas atmiņas apstrādes | Nepieciešama izpratne par atmiņas jēdzieniem |
Efektīva tīrīšana pa paaudzēm | Ierobežota kontrole pār GC laiku |
Pielāgojami GC iestatījumi | Kļūdu vai atmiņas noplūdes iespēja |