logo

Roskakeräys Pythonissa

Roskien keräys sisään Python on automaattinen prosessi, joka käsittelee muistin varaamisen ja purkamisen varmistaen tehokkaan muistin käytön. Toisin kuin kielet, kuten C tai C++ jossa ohjelmoijan täytyy varata ja vapauttaa muisti manuaalisesti Python hallitsee muistia automaattisesti kahden ensisijaisen strategian avulla:

  1. Viitelaskenta
  2. Roskien keräys

Viitelaskenta

Python käyttää viitelaskenta muistin hallintaan. Jokainen objekti pitää kirjaa siitä, kuinka monta viittausta siihen viittaa. Kun viitemäärä putoaa nollaan, eli viittauksia ei ole jäljellä, Python purkaa objektin automaattisesti. Esimerkki:

Python
import sys x = [1 2 3] print(sys.getrefcount(x)) y = x print(sys.getrefcount(x)) y = None print(sys.getrefcount(x)) 

Lähtö
2 3 2 

Selitys:



  • x viitataan aluksi kahdesti (kerran x:llä kerran getrefcount()-toiminnolla).
  • Määritetään y = x lisää määrää.
  • Asetus y = Ei mitään poistaa yhden viittauksen.

Ongelma referenssilaskennassa

Viitteiden laskenta epäonnistuu syklisten viitteiden, eli objektien, jotka viittaavat toisiinsa syklissä, läsnä ollessa. Vaikka mikään muu ei viittaa niihin, heidän viitemääränsä ei koskaan saavuta nollaa. Esimerkki:

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

Lähtö
3 3 

Selitys:

  • x sisältää ja ja ja sisältää x .
  • Myös poistamisen jälkeen x ja ja Python ei pysty vapauttamaan muistia pelkästään viitelaskennan avulla, koska jokainen viittaa edelleen toiseen.

Roskien keräys syklisiä referenssejä varten

Roskien keräys on muistinhallintatekniikka, jota käytetään ohjelmointikielissä palauttamaan automaattisesti muistia, joka ei ole enää käytettävissä tai sovelluksen käytössä. Python käyttää tällaisia ​​pyöreitä viittauksia käsittelemään a Roskien kerääjä (GC) sisäänrakennetusta gc-moduulista. Tämä keräilijä pystyy havaitsemaan ja puhdistamaan referenssisykleissä mukana olevat kohteet.

Sukupolvien roskien keräys

Pythonin Generational Garbage Collector on suunniteltu käsittelemään syklisiä viittauksia. Se järjestää esineet kolmeen sukupolveen niiden elinkaaren perusteella:

  • Sukupolvi 0: Äskettäin luodut objektit.
  • Sukupolvi 1: Esineet, jotka selvisivät yhdestä keräysjaksosta.
  • Sukupolvi 2: Pitkäikäiset esineet.

Kun referenssijaksot tapahtuvat, roskankerääjä havaitsee ja puhdistaa ne automaattisesti vapauttaen muistia.

Pyörien automaattinen roskakeräys

Jätteiden keräys käynnistyy automaattisesti, kun allokaatioiden määrä ylittää tietyn kynnysarvon. Tämä kynnysarvo voidaan tarkistaa gc-moduulilla.

Python
import gc print(gc.get_threshold()) 

Lähtö
(2000 10 10) 

Selitys: Se palauttaa kynnysarvon sukupolville 0 1 ja 2. Kun allokaatiot ylittävät kynnysarvon, keräys laukeaa.

Manuaalinen roskien keräys

Joskus on hyödyllistä käynnistää roskankeräin manuaalisesti, erityisesti referenssijaksojen tapauksessa. Esimerkki:

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) 

Lähtö
0 10 

Selitys:

  • hauskaa(i) luo syklisen viittauksen tekemällä itse sanakirjaviittauksen.
  • gc.collect() käynnistää roskien keräämisen ja tallentaa kerättyjen kohteiden määrän (alku 0).
  • minulle alueella (10) puhelut hauskaa (i) 10 kertaa luomalla 10 syklistä viittausta.
  • gc.collect() käynnistää roskatkeräyksen uudelleen ja tulostaa kerättyjen jaksojen lukumäärän.

Manuaalisen jätteenkeräyksen tyypit

  • Aikaperusteinen jätteenkeruu: Jätteenkeräin laukeaa tietyin aikavälein.
  • Tapahtumapohjainen roskakeräys: Roskankerääjä kutsutaan vastauksena tiettyihin tapahtumiin, kuten kun käyttäjä poistuu sovelluksesta tai kun sovellus tulee käyttämättömäksi.

Pakkojätteen kerääminen

Pythonin roskienkeräin (GC) siivoaa käyttämättömät kohteet automaattisesti. Voit pakottaa sen manuaalisesti käyttämällä gc.collect()-komentoa gc-moduulista. Esimerkki:

Python
import gc a = [1 2 3] b = {'a': 1 'b': 2} c = 'Hello world!' del abc gc.collect() 

Selitys:

  • alkaen a b c poistaa viittaukset a b ja c tekee niistä oikeutettuja jätteenkeräykseen.
  • gc.collect() pakottaa roskienkeruun vapauttamaan muistia puhdistamalla viittamattomia kohteita.

Roskankeruun poistaminen käytöstä

Pythonissa roskankeräys toimii automaattisesti puhdistaakseen viittaamattomat kohteet. Voit estää sen suorittamisen poistamalla sen käytöstä komennolla gc.disable() gc-moduulista. Esimerkki:

Python
import gc gc.disable() gc.enable() 

Selitys:

  • gc.disable() poistaa automaattisen jätteenkeräyksen käytöstä.
  • gc.enable() ottaa uudelleen käyttöön automaattisen jätteenkeräyksen.

Vuorovaikutus python-jätteenkeräajan kanssa

Sisäänrakennettu mekanismi, nimeltään Python roskakeräin, poistaa automaattisesti kohteet, joihin ei enää viitata, vapauttaakseen muistia ja estääkseen muistivuotoja. Python gc -moduuli tarjoaa useita tapoja olla vuorovaikutuksessa roskakeräimen kanssa, joka usein suoritetaan automaattisesti.

1. Jätteenkeräimen ottaminen käyttöön ja poistaminen käytöstä: Voit ottaa roskankeräimen käyttöön tai poistaa sen käytöstä käyttämällä gc. salli() ja gc. disable() toimintoja vastaavasti. Esimerkki :

kuinka tarkistaa näytön koko
Python
import gc # Disable  gc.disable() # Enable gc.enable() 

2. Roskien keräämisen pakottaminen: Voit käynnistää roskien keräämisen manuaalisesti käyttämällä gc. kerätä() toiminto. Tästä voi olla hyötyä tapauksissa, joissa haluat pakottaa välittömän jätteenkeräyksen sen sijaan, että odotat automaattista jätteenkeräystä.  Esimerkki:

Python
import gc gc.collect() 

3. Jätteenkeräimen asetusten tarkistaminen: Voit tarkistaa roskakeräimen nykyiset asetukset käyttämällä gc.get_threshold() funktio, joka palauttaa monikon, joka edustaa nykyisiä kynnysarvoja sukupolville 0 1 ja 2.  Esimerkki:

Python
import gc t = gc.get_threshold() print(t) 

Lähtö
(2000 10 10) 

4. Jätteenkeräysrajojen asettaminen: Voit asettaa kynnykset roskien keräämiselle käyttämällä gc.set_threshold() toiminto. Tämän avulla voit säätää manuaalisesti eri sukupolvien kynnysarvoja, jotka voivat vaikuttaa roskien keräystiheyteen.  Esimerkki:

Python
import gc gc.set_threshold(500 5 5) t = gc.get_threshold() print(t) 

Lähtö
(500 5 5) 

Edut ja haitat 

Tutkitaan joitain Pythonin roskienkeruun etuja ja haittoja.

Edut

Haitat

Automaattinen muistinhallinta

Saattaa lisätä suorituskykyä

Ei manuaalista muistinkäsittelyä

Edellyttää muistikäsitteiden ymmärtämistä

Tehokas puhdistus sukupolvien kautta

Rajoitettu valvonta GC:n ajoitukseen

Mukautettavat GC-asetukset

Virheiden tai muistivuotojen mahdollisuus

Luo tietokilpailu