logo

Atkritumu savākšana programmā Python

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:

  1. Atsauces skaitīšana
  2. 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:

Python
import 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:

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

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.

Python
import 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:

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) 

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:

Python
import 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:

Python
import 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 funkcija
Python
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:

Python
import 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:

Python
import 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:

Python
import 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

Izveidojiet viktorīnu