logo

Recollida d'escombraries en Python

Recollida d'escombraries en Python és un procés automàtic que gestiona l'assignació i la desassignació de memòria assegurant un ús eficient de la memòria. A diferència de llengües com ara C o C++ on el programador ha d'assignar i desassignar la memòria manualment Python gestiona automàticament la memòria mitjançant dues estratègies principals:

  1. Recompte de referències
  2. Recollida d'escombraries

Recompte de referències

Python utilitza recompte de referències per gestionar la memòria. Cada objecte fa un seguiment de quantes referències hi apunten. Quan el recompte de referències cau a zero, és a dir, no queden referències, Python desassigna automàticament l'objecte. Exemple:

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

Sortida
2 3 2 

Explicació:



  • x es fa referència inicialment dues vegades (una vegada per x una vegada per getrefcount()).
  • Assignació y = x augmenta el recompte.
  • Configuració y = Cap elimina una referència.

Problema amb el recompte de referències

El recompte de referències falla en presència de referències cícliques, és a dir, objectes que es refereixen entre si en un cicle. Encara que res més els indiqui, el seu recompte de referència mai arriba a zero. Exemple:

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

Sortida
3 3 

Explicació:

  • x conté i i i conté x .
  • Fins i tot després de suprimir x i i Python no podrà alliberar la memòria només utilitzant el recompte de referències perquè cadascun encara fa referència a l'altre.

Recollida d'escombraries per a Referències cícliques

Recollida d'escombraries és una tècnica de gestió de memòria que s'utilitza en llenguatges de programació per recuperar automàticament la memòria que ja no és accessible o utilitzada per l'aplicació. Per gestionar aquestes referències circulars, Python utilitza a Recollidor d'escombraries (GC) des del mòdul gc integrat. Aquest col·lector és capaç de detectar i netejar objectes implicats en cicles de referència.

Recollida d'escombraries generacional

El Recollidor d'escombraries generacional de Python està dissenyat per tractar referències cícliques. Organitza els objectes en tres generacions en funció de la seva vida útil:

  • Generació 0: objectes de nova creació.
  • Generació 1: objectes que van sobreviure a un cicle de recollida.
  • 2a generació: objectes de llarga vida.

Quan es produeixen cicles de referència, el col·lector d'escombraries els detecta i neteja automàticament alliberant la memòria.

Recollida automàtica d'escombraries de cicles

La recollida d'escombraries s'executa automàticament quan el nombre d'assignacions supera el nombre de desassignacions en un determinat llindar. Aquest llindar es pot inspeccionar mitjançant el mòdul gc.

Python
import gc print(gc.get_threshold()) 

Sortida
(2000 10 10) 

Explicació: Retorna la tupla llindar per a les generacions 0, 1 i 2. Quan les assignacions superen el llindar s'activa la recollida.

Recollida manual d'escombraries

De vegades és beneficiós invocar manualment el col·lector d'escombraries, especialment en el cas dels cicles de referència. Exemple:

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) 

Sortida
0 10 

Explicació:

  • sens dubte divertit (i) crea una referència cíclica fent una referència al diccionari.
  • gc.collect() activa la recollida d'escombraries i emmagatzema el recompte d'objectes recollits (inicialment 0).
  • per jo dins el rang (10) trucades diversió (i) 10 vegades creant 10 referències cícliques.
  • gc.collect() torna a activar la recollida d'escombraries i imprimeix el recompte de cicles recollits.

Tipus de recollida manual d'escombraries

  • Recollida d'escombraries per temps: El col·lector d'escombraries s'activa a intervals de temps determinats.
  • Recollida d'escombraries basada en esdeveniments: El col·lector d'escombraries es crida en resposta a esdeveniments específics, com ara quan un usuari surt de l'aplicació o quan l'aplicació queda inactiva.

Recollida forçosa d'escombraries

El col·lector d'escombraries (GC) de Python s'executa automàticament per netejar objectes no utilitzats. Per forçar-ho manualment, utilitzeu gc.collect() des del mòdul gc. Exemple:

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

Explicació:

  • de l'a b c elimina les referències a a b i c fent-los aptes per a la recollida d'escombraries.
  • gc.collect() obliga la recollida d'escombraries a alliberar memòria netejant objectes sense referència.

S'està desactivant la recollida d'escombraries

A Python, el col·lector d'escombraries s'executa automàticament per netejar objectes sense referència. Per evitar que s'executi, podeu desactivar-lo mitjançant gc.disable() des del mòdul gc. Exemple:

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

Explicació:

  • gc.disable() desactiva la recollida automàtica d'escombraries.
  • gc.enable() torna a activar la recollida automàtica d'escombraries.

Interacció amb el recol·lector d'escombraries Python

Un mecanisme integrat anomenat col·lector d'escombraries de Python elimina automàticament els objectes que ja no es fan referència per alliberar memòria i aturar les fuites de memòria. El mòdul Python gc ofereix diverses maneres d'interactuar amb el col·lector d'escombraries que sovint s'executa automàticament.

1. Habilitació i desactivació del col·lector d'escombraries: Podeu activar o desactivar el col·lector d'escombraries mitjançant el gc. habilitar () i gc. desactivar () funcions respectivament. Exemple :

Emojis de poma a Android
Python
import gc # Disable  gc.disable() # Enable gc.enable() 

2. Forçar la recollida d'escombraries: Podeu activar manualment una recollida d'escombraries mitjançant el gc. recollir () funció. Això pot ser útil en els casos en què voleu forçar la recollida d'escombraries immediata en lloc d'esperar que es produeixi la recollida automàtica d'escombraries.  Exemple:

Python
import gc gc.collect() 

3. Inspecció de la configuració del col·lector d'escombraries: Podeu inspeccionar la configuració actual del col·lector d'escombraries mitjançant el gc.get_threshold() funció que retorna una tupla que representa els llindars actuals de les generacions 0, 1 i 2.  Exemple:

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

Sortida
(2000 10 10) 

4. Establir els llindars dels col·lectors d'escombraries: Podeu establir els llindars per a la recollida d'escombraries mitjançant el gc.set_threshold() funció. Això us permet ajustar manualment els llindars per a diferents generacions que poden afectar la freqüència de recollida d'escombraries.  Exemple:

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

Sortida
(500 5 5) 

Avantatges i desavantatges 

Explorem alguns dels avantatges i inconvenients de la recollida d'escombraries de Python.

Avantatges

Inconvenients

Gestió automàtica de la memòria

Pot introduir una sobrecàrrega de rendiment

Sense manipulació manual de la memòria

Requereix la comprensió dels conceptes de memòria

Neteja eficient a través de generacions

Control limitat sobre el temps del GC

Configuració de GC personalitzable

Possibilitat d'errors o fuites de memòria

Crea un qüestionari