logo

Šiukšlių rinkimas Python

Š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:

  1. Nuorodų skaičiavimas
  2. Š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:

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

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

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į.

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

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) 

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:

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

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

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

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

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

Sukurti viktoriną