logo

Collecte des déchets en Python

Collecte des déchets dans Python est un processus automatique qui gère l'allocation et la désallocation de mémoire garantissant une utilisation efficace de la mémoire. Contrairement à des langues comme C ou C++ où le programmeur doit allouer et libérer manuellement la mémoire. Python gère automatiquement la mémoire via deux stratégies principales :

  1. Comptage de références
  2. Collecte des déchets

Comptage de références

Python utilise comptage de références pour gérer la mémoire. Chaque objet garde une trace du nombre de références qui pointent vers lui. Lorsque le nombre de références tombe à zéro, c'est-à-dire qu'il ne reste aucune référence, Python libère automatiquement l'objet. Exemple:

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

Sortir
2 3 2 

Explication:



  • x est référencé deux fois initialement (une fois par x une fois par getrefcount()).
  • Attribution y = x augmente le compte.
  • Paramètre y = Aucun supprime une référence.

Problème avec le comptage de références

Le comptage de références échoue en présence de références cycliques, c'est-à-dire d'objets qui se référencent les uns les autres dans un cycle. Même si rien d’autre ne les indique, leur nombre de références n’atteint jamais zéro. 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)) 

Sortir
3 3 

Explication:

  • x contient et et et contient x .
  • Même après avoir supprimé x et et Python ne pourra pas libérer de la mémoire simplement en utilisant le comptage de références, car chacun fait toujours référence à l'autre.

Collecte des déchets pour les références cycliques

Collecte des déchets est une technique de gestion de la mémoire utilisée dans les langages de programmation pour récupérer automatiquement la mémoire qui n'est plus accessible ou utilisée par l'application. Pour gérer de telles références circulaires, Python utilise un Éboueur (GC) à partir du module gc intégré. Ce collecteur est capable de détecter et de nettoyer les objets impliqués dans les cycles de référence.

Collecte des déchets générationnelle

Le Generational Garbage Collector de Python est conçu pour gérer les références cycliques. Il organise les objets en trois générations en fonction de leur durée de vie :

  • Génération 0 : objets nouvellement créés.
  • Génération 1 : Objets ayant survécu à un cycle de collecte.
  • Génération 2 : Objets à longue durée de vie.

Lorsque des cycles de référence se produisent, le garbage collector les détecte et les nettoie automatiquement, libérant ainsi la mémoire.

Collecte automatique des déchets des cycles

Le garbage collection s'exécute automatiquement lorsque le nombre d'allocations dépasse le nombre de désallocations d'un certain seuil. Ce seuil peut être inspecté à l’aide du module gc.

Python
import gc print(gc.get_threshold()) 

Sortir
(2000 10 10) 

Explication: Il renvoie le tuple de seuil pour les générations 0, 1 et 2. Lorsque les allocations dépassent le seuil, la collecte est déclenchée.

Collecte manuelle des déchets

Parfois, il est avantageux d’invoquer manuellement le garbage collector, notamment dans le cas de cycles de référence. 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) 

Sortir
0 10 

Explication:

  • vraiment amusant (je) crée une référence cyclique en créant lui-même une référence au dictionnaire.
  • gc.collect() déclenche le garbage collection et stocke le nombre d’objets collectés (initialement 0).
  • pour moi dans la plage (10) appels amusant (je) 10 fois en créant 10 références cycliques.
  • gc.collect() déclenche à nouveau le garbage collection et imprime le nombre de cycles collectés.

Types de collecte manuelle des déchets

  • Collecte des déchets basée sur le temps : Le garbage collector est déclenché à intervalles de temps fixes.
  • Collecte des déchets basée sur les événements : Le garbage collector est appelé en réponse à des événements spécifiques, tels que lorsqu'un utilisateur quitte l'application ou lorsque l'application devient inactive.

Collectes forcées d'ordures

Le garbage collector (GC) de Python s'exécute automatiquement pour nettoyer les objets inutilisés. Pour le forcer manuellement, utilisez gc.collect() du module gc. Exemple:

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

Explication:

  • de l'abc supprime les références à un b et c les rendant éligibles à la collecte des déchets.
  • gc.collect() force le garbage collection à libérer de la mémoire en nettoyant les objets non référencés.

Désactivation du garbage collection

En Python, le garbage collector s'exécute automatiquement pour nettoyer les objets non référencés. Pour l'empêcher de s'exécuter, vous pouvez le désactiver en utilisant gc.disable() du module gc. Exemple:

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

Explication:

  • gc.disable() désactive le garbage collection automatique.
  • gc.enable() réactive la collecte automatique des déchets.

Interagir avec le garbage collector python

Un mécanisme intégré appelé garbage collector Python élimine automatiquement les objets qui ne sont plus référencés afin de libérer de la mémoire et d'arrêter les fuites de mémoire. Le module Python gc offre plusieurs façons d'interagir avec le garbage collector qui est souvent exécuté automatiquement.

1. Activation et désactivation du garbage collector : Vous pouvez activer ou désactiver le garbage collector à l'aide du gc. activer() et gc. désactiver() fonctions respectivement. Exemple :

java sinon
Python
import gc # Disable  gc.disable() # Enable gc.enable() 

2. Forcer le garbage collection : Vous pouvez déclencher manuellement un garbage collection à l'aide de l'outil gc. collecter() fonction. Cela peut être utile dans les cas où vous souhaitez forcer le garbage collection immédiat au lieu d’attendre que le garbage collection automatique se produise.  Exemple:

Python
import gc gc.collect() 

3. Inspection des paramètres du garbage collector : Vous pouvez inspecter les paramètres actuels du garbage collector à l'aide de l'outil gc.get_threshold() fonction qui renvoie un tuple représentant les seuils actuels pour les générations 0 1 et 2.  Exemple:

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

Sortir
(2000 10 10) 

4. Définition des seuils du garbage collector : Vous pouvez définir les seuils de garbage collection à l'aide de l'outil gc.set_threshold() fonction. Cela vous permet d'ajuster manuellement les seuils pour différentes générations, ce qui peut affecter la fréquence du garbage collection.  Exemple:

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

Sortir
(500 5 5) 

Avantages et inconvénients 

Explorons certains des avantages et des inconvénients du garbage collection de Python.

Avantages

Inconvénients

Gestion automatique de la mémoire

Peut introduire une surcharge de performances

Pas de gestion manuelle de la mémoire

Nécessite une compréhension des concepts de mémoire

Nettoyage efficace via des générations

Contrôle limité sur le timing du GC

Paramètres GC personnalisables

Possibilité de bugs ou de fuites de mémoire

Créer un quiz