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:
- Recompte de referències
- 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:
Pythonimport 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:
Pythonimport 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.
Pythonimport 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:
Pythonimport 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:
Pythonimport 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:
Pythonimport 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 AndroidPython
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:
Pythonimport 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:
Pythonimport 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:
Pythonimport 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 |