logo

Zber odpadu v Pythone

Odvoz odpadu v Python je automatický proces, ktorý sa stará o prideľovanie a udeľovanie pamäte a zabezpečuje efektívne využitie pamäte. Na rozdiel od jazykov ako napr C alebo C++ kde programátor musí manuálne prideľovať a udeľovať pamäť Python automaticky spravuje pamäť prostredníctvom dvoch základných stratégií:

  1. Referenčné počítanie
  2. Odvoz odpadu

Referenčné počítanie

Používa Python počítanie referencií na správu pamäte. Každý objekt sleduje, koľko referencií naň ukazuje. Keď počet referencií klesne na nulu, t. j. nezostanú žiadne referencie, Python automaticky uvoľní objekt. Príklad:

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

Výstup
2 3 2 

Vysvetlenie:



  • x sa na začiatku odkazuje dvakrát (raz x raz pomocou getrefcount()).
  • Priraďovanie y = x zvyšuje počet.
  • Nastavenie y = žiadne odstráni jednu referenciu.

Problém s počítaním referencií

Počítanie referencií zlyhá v prítomnosti cyklických referencií, t. j. objektov, ktoré sa navzájom odkazujú v cykle. Aj keď na nich nič iné neukazuje, ich referenčný počet nikdy nedosiahne nulu. Príklad:

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

Výstup
3 3 

Vysvetlenie:

  • x obsahuje a a a obsahuje x .
  • Aj po vymazaní x a a Python nebude môcť uvoľniť pamäť iba pomocou počítania referencií, pretože každý stále odkazuje na druhého.

Zber odpadu pre cyklické referencie

Odvoz odpadu je technika správy pamäte používaná v programovacích jazykoch na automatické opätovné získanie pamäte, ktorá už nie je dostupná alebo používaná aplikáciou. Na spracovanie takýchto kruhových odkazov používa Python a Zberač odpadu (GC) zo vstavaného modulu gc. Tento kolektor je schopný detekovať a čistiť objekty zapojené do referenčných cyklov.

Generačný zber odpadu

Generational Garbage Collector Pythonu je navrhnutý tak, aby sa vysporiadal s cyklickými referenciami. Organizuje predmety do troch generácií na základe ich životnosti:

  • Generácia 0: Novo vytvorené objekty.
  • Generácia 1: Predmety, ktoré prežili jeden cyklus zberu.
  • Generácia 2: Objekty s dlhou životnosťou.

Keď sa vyskytnú referenčné cykly, zberač odpadu ich automaticky rozpozná a vyčistí, čím uvoľní pamäť.

Automatický zber odpadu cyklov

Zber odpadu sa spustí automaticky, keď počet alokácií prekročí počet rozdelení o určitú hranicu. Tento prah je možné skontrolovať pomocou modulu gc.

Python
import gc print(gc.get_threshold()) 

Výstup
(2000 10 10) 

Vysvetlenie: Vracia prahovú n-ticu pre generácie 0 1 a 2. Keď alokácie prekročia prahovú hodnotu, spustí sa zber.

Ručný zber odpadu

Niekedy je užitočné manuálne vyvolať zberač odpadu, najmä v prípade referenčných cyklov. Príklad:

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) 

Výstup
0 10 

Vysvetlenie:

  • určite zábava (i) vytvára cyklický odkaz vytvorením samotného slovníkového odkazu.
  • gc.collect() spustí zber odpadu a uloží počet zozbieraných predmetov (na začiatku 0).
  • pre i v dosahu (10) hovory zábava (i) 10-krát vytvorenie 10 cyklických referencií.
  • gc.collect() znovu spustí zber odpadu a vypíše počet zozbieraných cyklov.

Typy ručného zberu odpadu

  • Zber odpadu podľa času: Zberač odpadu sa spúšťa v stanovených časových intervaloch.
  • Zber odpadu na základe udalostí: Zberač odpadu sa volá v reakcii na špecifické udalosti, napríklad keď používateľ ukončí aplikáciu alebo keď sa aplikácia stane nečinnou.

Nútený zber odpadu

Python's garbage collector (GC) sa spúšťa automaticky, aby vyčistil nepoužívané objekty. Na manuálne vynútenie použite gc.collect() z modulu gc. Príklad:

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

Vysvetlenie:

  • z a b c vymaže odkazy na a b a c aby boli spôsobilé na odvoz odpadu.
  • gc.collect() prinúti garbage collection uvoľniť pamäť vyčistením nereferencovaných objektov.

Zakázanie zberu odpadu

V Pythone sa automaticky spustí garbage collector, aby vyčistil nereferencované objekty. Ak chcete zabrániť jeho spusteniu, môžete ho vypnúť pomocou gc.disable() z modulu gc. Príklad:

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

Vysvetlenie:

  • gc.disable() zakáže automatický zber odpadu.
  • gc.enable() znovu povolí automatický zber odpadu.

Interakcia s python garbage collector

Vstavaný mechanizmus nazývaný Python garbage collector automaticky eliminuje objekty, ktoré už nie sú odkazované, aby sa uvoľnila pamäť a zastavili sa úniky pamäte. Modul Python gc ponúka množstvo spôsobov interakcie s garbage collectorom, ktorý sa často spúšťa automaticky.

1. Zapnutie a vypnutie zberača odpadu: Zberač odpadu môžete povoliť alebo zakázať pomocou gc. povoliť () a gc. zakázať () funkcie resp. Príklad :

zoznam triediacich polí java
Python
import gc # Disable  gc.disable() # Enable gc.enable() 

2. Nútený zber odpadu: Zber odpadu môžete spustiť manuálne pomocou gc. zbierať () funkciu. To môže byť užitočné v prípadoch, keď chcete vynútiť okamžité zbieranie odpadu namiesto čakania na automatické zbieranie odpadu.  Príklad:

Python
import gc gc.collect() 

3. Kontrola nastavení zberača odpadu: Aktuálne nastavenia zberača odpadu môžete skontrolovať pomocou gc.get_threshold() funkcia, ktorá vracia n-ticu predstavujúcu aktuálne prahové hodnoty pre generácie 0 1 a 2.  Príklad:

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

Výstup
(2000 10 10) 

4. Nastavenie prahov zberača odpadu: Prahové hodnoty pre zber odpadu môžete nastaviť pomocou gc.set_threshold() funkciu. To vám umožňuje manuálne upraviť prahové hodnoty pre rôzne generácie, čo môže ovplyvniť frekvenciu zberu odpadu.  Príklad:

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

Výstup
(500 5 5) 

Výhody a nevýhody 

Poďme preskúmať niektoré výhody a nevýhody zberu odpadu v Pythone.

Výhody

Nevýhody

Automatická správa pamäte

Môže zaviesť réžiu výkonu

Žiadna manuálna manipulácia s pamäťou

Vyžaduje pochopenie pamäťových pojmov

Efektívne čistenie prostredníctvom generácií

Obmedzená kontrola nad načasovaním GC

Prispôsobiteľné nastavenia GC

Možnosť chýb alebo únikov pamäte

Vytvoriť kvíz