Raccolta dei rifiuti In Pitone è un processo automatico che gestisce l'allocazione e la deallocazione della memoria garantendo un utilizzo efficiente della memoria. A differenza di lingue come C O C++ dove il programmatore deve allocare e deallocare manualmente la memoria Python gestisce automaticamente la memoria attraverso due strategie principali:
- Conteggio dei riferimenti
- Raccolta dei rifiuti
Conteggio dei riferimenti
Python utilizza conteggio dei riferimenti per gestire la memoria. Ogni oggetto tiene traccia di quanti riferimenti puntano ad esso. Quando il conteggio dei riferimenti scende a zero, ovvero non rimangono riferimenti, Python rilascia automaticamente l'oggetto. Esempio:
Pythonimport sys x = [1 2 3] print(sys.getrefcount(x)) y = x print(sys.getrefcount(x)) y = None print(sys.getrefcount(x))
Produzione
2 3 2
Spiegazione:
- X viene fatto riferimento due volte inizialmente (una volta da x una volta da getrefcount()).
- Assegnazione y = x aumenta il conteggio.
- Collocamento y = Nessuno rimuove un riferimento.
Problema con il conteggio dei riferimenti
Il conteggio dei riferimenti fallisce in presenza di riferimenti ciclici, cioè di oggetti che si riferiscono tra loro in un ciclo. Anche se nient'altro li indica, il loro conteggio di riferimento non raggiunge mai lo zero. Esempio:
Pythonimport sys x = [1 2 3] y = [4 5 6] x.append(y) y.append(x) print(sys.getrefcount(x)) print(sys.getrefcount(y))
Produzione
3 3
Spiegazione:
- X contiene E E E contiene X .
- Anche dopo l'eliminazione X E E Python non sarà in grado di liberare la memoria semplicemente utilizzando il conteggio dei riferimenti perché ognuno fa ancora riferimento all'altro.
Garbage Collection per riferimenti ciclici
Raccolta dei rifiuti è una tecnica di gestione della memoria utilizzata nei linguaggi di programmazione per recuperare automaticamente la memoria che non è più accessibile o utilizzata dall'applicazione. Per gestire tali riferimenti circolari Python usa a Raccoglitore di rifiuti (GC) dal modulo gc integrato. Questo raccoglitore è in grado di rilevare e ripulire gli oggetti coinvolti nei cicli di riferimento.
Raccolta dei rifiuti generazionali
Il Garbage Collector generazionale di Python è progettato per gestire riferimenti ciclici. Organizza gli oggetti in tre generazioni in base alla loro durata di vita:
- Generazione 0: oggetti appena creati.
- Generazione 1: oggetti sopravvissuti a un ciclo di raccolta.
- Generazione 2: Oggetti longevi.
Quando si verificano cicli di riferimento, il Garbage Collector li rileva e li pulisce automaticamente liberando memoria.
Garbage Collection automatica dei cicli
La Garbage Collection viene eseguita automaticamente quando il numero di allocazioni supera il numero di deallocazioni di una determinata soglia. Questa soglia può essere controllata utilizzando il modulo gc.
Pythonimport gc print(gc.get_threshold())
Produzione
(2000 10 10)
Spiegazione: Restituisce la tupla soglia per le generazioni 0 1 e 2. Quando le allocazioni superano la raccolta soglia viene attivata.
Raccolta manuale dei rifiuti
A volte è utile richiamare manualmente il garbage collector soprattutto nel caso di cicli di riferimento. Esempio:
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)
Produzione
0 10
Spiegazione:
- sicuramente divertente(i) crea un riferimento ciclico creando esso stesso un riferimento al dizionario.
- gc.collect() attiva la garbage collection e memorizza il conteggio degli oggetti raccolti (inizialmente 0).
- per i nell'intervallo(10) chiamate divertimento(i) 10 volte creando 10 riferimenti ciclici.
- gc.collect() riavvia la garbage collection e stampa il conteggio dei cicli raccolti.
Tipi di Garbage Collection manuale
- Garbage Collection basata sul tempo: Il Garbage Collector viene attivato a intervalli di tempo fissi.
- Garbage Collection basata sugli eventi: Il Garbage Collector viene chiamato in risposta a eventi specifici come quando un utente esce dall'applicazione o quando l'applicazione diventa inattiva.
Raccolta forzata dei rifiuti
Il Garbage Collector (GC) di Python viene eseguito automaticamente per ripulire gli oggetti inutilizzati. Per forzarlo manualmente utilizzare gc.collect() dal modulo gc. Esempio:
Pythonimport gc a = [1 2 3] b = {'a': 1 'b': 2} c = 'Hello world!' del abc gc.collect()
Spiegazione:
- dall'abc elimina i riferimenti a un b E C rendendoli idonei alla raccolta dei rifiuti.
- gc.collect() forza la garbage collection a liberare memoria ripulendo gli oggetti senza riferimenti.
Disabilitare la raccolta dei rifiuti
In Python il garbage collector viene eseguito automaticamente per ripulire gli oggetti senza riferimenti. Per impedirne l'esecuzione puoi disabilitarlo utilizzando gc.disable() dal modulo gc. Esempio:
Pythonimport gc gc.disable() gc.enable()
Spiegazione:
- gc.disable() disabilita la raccolta automatica dei rifiuti.
- gc.abilita() riattiva la garbage collection automatica.
Interazione con Python Garbage Collector
Un meccanismo integrato chiamato Garbage Collector di Python elimina automaticamente gli oggetti a cui non viene più fatto riferimento per liberare memoria e interrompere le perdite di memoria. Il modulo gc di Python offre diversi modi per interagire con il garbage collector che spesso viene eseguito automaticamente.
1. Abilitare e disabilitare il Garbage Collector: È possibile abilitare o disabilitare il Garbage Collector utilizzando il file g.c. abilitare() E g.c. disabilita() funzioni rispettivamente. Esempio :
I comandi Linux creano la cartellaPython
import gc # Disable gc.disable() # Enable gc.enable()
2. Forzare la raccolta dei rifiuti: È possibile attivare manualmente una garbage collection utilizzando il file g.c. raccogliere() funzione. Ciò può essere utile nei casi in cui si desidera forzare la Garbage Collection immediata anziché attendere l'esecuzione della Garbage Collection automatica. Esempio:
Pythonimport gc gc.collect()
3. Ispezione delle impostazioni del Garbage Collector: È possibile controllare le impostazioni correnti del Garbage Collector utilizzando il file gc.get_threshold() funzione che restituisce una tupla che rappresenta le soglie correnti per le generazioni 0 1 e 2. Esempio:
Pythonimport gc t = gc.get_threshold() print(t)
Produzione
(2000 10 10)
4. Impostazione delle soglie del Garbage Collector: È possibile impostare le soglie per la garbage collection utilizzando il file gc.set_threshold() funzione. Ciò consente di regolare manualmente le soglie per generazioni diverse che possono influenzare la frequenza della raccolta dei rifiuti. Esempio:
Pythonimport gc gc.set_threshold(500 5 5) t = gc.get_threshold() print(t)
Produzione
(500 5 5)
Vantaggi e svantaggi
Esploriamo alcuni dei vantaggi e degli svantaggi della garbage collection di Python.
Vantaggi | Svantaggi |
|---|---|
Gestione automatica della memoria | Può introdurre un sovraccarico delle prestazioni |
Nessuna gestione manuale della memoria | Richiede la comprensione dei concetti di memoria |
Pulizia efficiente attraverso generazioni | Controllo limitato sui tempi di GC |
Impostazioni GC personalizzabili | Possibilità di bug o perdite di memoria |