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:
- Conteo de referencias
- 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:
Pythonimport 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:
Pythonimport 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.
Pythonimport 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:
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)
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:
Pythonimport 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:
Pythonimport 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 tablasPython
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:
Pythonimport 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:
Pythonimport 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:
Pythonimport 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. |