logo

Recolección de basura en Python

Recolección de basura en Pitón es un proceso automático que maneja la asignación y desasignación de memoria asegurando un uso eficiente de la memoria. A diferencia de lenguas como do o C++ donde el programador debe asignar y desasignar memoria manualmente, Python administra automáticamente la memoria a través de dos estrategias principales:

  1. Conteo de referencias
  2. Recolección de basura

Conteo de referencias

Usos de Python conteo de referencia para gestionar la memoria. Cada objeto realiza un seguimiento de cuántas referencias apuntan a él. Cuando el recuento de referencias cae a cero, es decir, no quedan referencias, Python desasigna automáticamente el objeto. Ejemplo:

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

Producción
2 3 2 

Explicación:



  • incógnita se hace referencia dos veces inicialmente (una vez por x y otra por getrefcount()).
  • Asignar y = x aumenta el conteo.
  • Configuración y = Ninguno elimina una referencia.

Problema con el recuento de referencias

El recuento de referencias falla en presencia de referencias cíclicas, es decir, objetos que hacen referencia entre sí en un ciclo. Incluso si nada más los señala, su recuento de referencias nunca llega a cero. Ejemplo:

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

Producción
3 3 

Explicación:

  • incógnita contiene y y y contiene incógnita .
  • Incluso después de eliminar incógnita y y Python no podrá liberar memoria simplemente usando el conteo de referencias porque cada uno todavía hace referencia al otro.

Recolección de basura para Referencias Cíclicas

Recolección de basura es una técnica de gestión de memoria utilizada en lenguajes de programación para recuperar automáticamente la memoria a la que la aplicación ya no puede acceder ni utilizar. Para manejar este tipo de referencias circulares, Python utiliza un recolector de basura (GC) desde el módulo gc incorporado. Este recolector es capaz de detectar y limpiar objetos involucrados en ciclos de referencia.

Recolección de basura generacional

El recolector de basura generacional de Python está diseñado para manejar referencias cíclicas. Organiza los objetos en tres generaciones según su vida útil:

  • Generación 0: Objetos recién creados.
  • Generación 1: Objetos que sobrevivieron a un ciclo de recolección.
  • Generación 2: Objetos de larga vida.

Cuando ocurren ciclos de referencia, el recolector de basura los detecta y limpia automáticamente, liberando memoria.

Recolección automática de basura de ciclos

La recolección de basura se ejecuta automáticamente cuando la cantidad de asignaciones excede la cantidad de desasignaciones en un umbral determinado. Este umbral se puede inspeccionar utilizando el módulo gc.

Python
import gc print(gc.get_threshold()) 

Producción
(2000 10 10) 

Explicación: Devuelve la tupla de umbral para las generaciones 0, 1 y 2. Cuando las asignaciones superan el umbral, se activa la colección.

Recolección manual de basura

A veces resulta beneficioso invocar manualmente el recolector de basura, especialmente en el caso de ciclos de referencia. Ejemplo:

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) 

Producción
0 10 

Explicación:

  • Definitivamente divertido (yo) crea una referencia cíclica haciendo una referencia de diccionario.
  • gc.recopilar() desencadena la recolección de basura y almacena el recuento de objetos recolectados (inicialmente 0).
  • para i en el rango(10) llamadas divertido(yo) 10 veces creando 10 referencias cíclicas.
  • gc.recopilar() activa nuevamente la recolección de basura e imprime el recuento de ciclos recolectados.

Tipos de recolección manual de basura

  • Recolección de basura basada en el tiempo: El recolector de basura se activa en intervalos de tiempo fijos.
  • Recolección de basura basada en eventos: Se llama al recolector de basura en respuesta a eventos específicos, como cuando un usuario sale de la aplicación o cuando la aplicación queda inactiva.

Recolección forzada de basura

El recolector de basura (GC) de Python se ejecuta automáticamente para limpiar los objetos no utilizados. Para forzarlo manualmente, use gc.collect() del módulo gc. Ejemplo:

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

Explicación:

  • del a b c elimina las referencias a un segundo y do haciéndolos elegibles para la recolección de basura.
  • gc.recopilar() obliga a la recolección de basura a liberar memoria limpiando objetos sin referencia.

Deshabilitar la recolección de basura

En Python, el recolector de basura se ejecuta automáticamente para limpiar objetos sin referencia. Para evitar que se ejecute, puede desactivarlo usando gc.disable() desde el módulo gc. Ejemplo:

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

Explicación:

  • gc.disable() deshabilita la recolección automática de basura.
  • gc.enable() vuelve a habilitar la recolección automática de basura.

Interactuando con el recolector de basura de Python

Un mecanismo integrado llamado recolector de basura de Python elimina automáticamente los objetos a los que ya no se hace referencia para liberar memoria y detener las pérdidas de memoria. El módulo Python gc ofrece varias formas de interactuar con el recolector de basura que a menudo se ejecuta automáticamente.

1. Habilitar y deshabilitar el recolector de basura: Puede habilitar o deshabilitar el recolector de basura usando el gc. permitir() y gc. desactivar() funciones respectivamente. Ejemplo :

seleccione SQL de varias tablas
Python
import gc # Disable  gc.disable() # Enable gc.enable() 

2. Forzar la recolección de basura: Puede activar manualmente una recolección de basura usando el gc. recolectar() función. Esto puede resultar útil en los casos en los que desee forzar la recolección de basura inmediata en lugar de esperar a que se produzca la recolección automática de basura.  Ejemplo:

Python
import gc gc.collect() 

3. Inspeccionar la configuración del recolector de basura: Puede inspeccionar la configuración actual del recolector de basura usando el gc.get_threshold() Función que devuelve una tupla que representa los umbrales actuales para las generaciones 0, 1 y 2.  Ejemplo:

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

Producción
(2000 10 10) 

4. Establecer umbrales del recolector de basura: Puede establecer los umbrales para la recolección de basura usando el gc.set_threshold() función. Esto le permite ajustar manualmente los umbrales para diferentes generaciones, lo que puede afectar la frecuencia de la recolección de basura.  Ejemplo:

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

Producción
(500 5 5) 

Ventajas y desventajas 

Exploremos algunos de los beneficios y desventajas de la recolección de basura de Python.

Ventajas

Desventajas

Gestión automática de la memoria

Puede introducir una sobrecarga de rendimiento

Sin manejo manual de memoria

Requiere comprensión de conceptos de memoria.

Limpieza eficiente a través de generaciones

Control limitado sobre el tiempo de GC

Configuraciones de GC personalizables

Posibilidad de errores o pérdidas de memoria.

Crear cuestionario