Explicación detallada del mecanismo de recolección de basura de Python: recuento de referencias y recolector de basura circular

Mecanismo de recolección de basura de Python

El lenguaje de programación Python adopta un mecanismo automático de recolección de basura, que puede liberar automáticamente objetos que ya no son necesarios y devolver la memoria ocupada por ellos al sistema operativo para que otros programas la utilicen. Esto alivia la carga del programador hasta cierto punto, ya que no necesita liberar la memoria manualmente.

Mecanismo de conteo de referencias

Python utiliza principalmente el recuento de referencias como parte de su mecanismo de recolección de basura. Cada objeto tiene un contador de referencia que registra cuántas variables hacen referencia a ese objeto. Cuando el contador de referencia llega a cero, significa que ninguna variable hace referencia al objeto, y el objeto se convierte en un objeto basura y el mecanismo de recolección de basura lo eliminará automáticamente.

A continuación se muestra un ejemplo sencillo para demostrar cómo funciona el mecanismo de recuento de referencias:

class Person:
    def __init__(self, name):
        self.name = name

    def __del__(self):
        print(f'{
      
      self.name}对象被删除了')

# 创建两个对象,并相互引用
p1 = Person('Alice')
p2 = Person('Bob')

# 打印两个对象的引用计数器
print(sys.getrefcount(p1))  # 输出结果为2,包括p1和参数传递中的临时引用
print(sys.getrefcount(p2))  # 输出结果为2

# 断开对象之间的相互引用
p1 = None
p2 = None

# 观察析构函数的调用情况

En el ejemplo anterior, definimos una clase Persona, creamos dos objetos p1 y p2 y nos referenciamos entre sí. Utilice sys.getrefcount()la función para obtener el recuento de referencias de un objeto. Finalmente, establecemos las referencias de p1 y p2 en Ninguna, rompiendo las referencias mutuas entre ellas. En este momento, puede observar que __del__se llama al método y se imprime un mensaje de que el objeto se eliminó.

recolector de basura circular

Además del mecanismo de recuento de referencias, Python también utiliza un recolector de basura cíclico (Cycle GC) para procesar referencias circulares. Una referencia circular ocurre cuando dos o más objetos se refieren entre sí sin que otros objetos hagan referencia a ellos, lo que hace que los objetos sean inaccesibles. El recolector de basura cíclico escanea periódicamente los objetos en la memoria para detectar referencias cíclicas y limpiar estos objetos inaccesibles.

El siguiente es un ejemplo de referencia circular:

class A:
    def __init__(self, b):
        self.b = b

class B:
    def __init__(self, a):
        self.a = a

# 创建两个对象,并相互引用形成循环引用
a_obj = A(None)
b_obj = B(a_obj)
a_obj.b = b_obj

# 对象无法通过其他引用访问到
a_obj = None
b_obj = None

# 手动进行垃圾回收
gc.collect()

En este ejemplo, creamos dos objetos a_objy b_obj, que se refieren entre sí formando una referencia circular. Incluso si sus referencias están establecidas en Ninguna, no se puede acceder a estos objetos a través de otras referencias. Las llamadas manuales gc.collect()pueden forzar la recolección de basura y limpiar estos objetos inaccesibles.

Es importante tener en cuenta que, en la mayoría de los casos, no se requieren operaciones manuales de recolección de basura. El mecanismo de recolección de basura de Python se ejecutará automáticamente cuando sea apropiado. La llamada manual a la recolección de basura generalmente se usa en algunas situaciones especiales, como cuando se crea y destruye una gran cantidad de objetos, para optimizar el uso de la memoria.

Al comprender el mecanismo de recolección de basura de Python, los programadores pueden administrar mejor la memoria y mejorar la eficiencia y la capacidad de mantenimiento de su código.

resumen

El recolector de basura circular de Python funciona cuando hay referencias circulares entre objetos. El recolector de basura cíclico utiliza otra estrategia llamada marcar y barrer. Así es como funciona el recolector de basura cíclico:

  1. Fase de marcado: a partir del objeto raíz, el recolector de basura cíclico atraviesa todos los objetos accesibles y los marca como "vivos".
  2. Fase de limpieza: el recolector de basura cíclico escanea todos los objetos en la memoria del montón, determina los objetos no marcados como objetos basura y recupera su espacio de memoria.

El intérprete de Python controla automáticamente el tiempo de ejecución del recolector de basura cíclico. Cuando se alcanzan ciertas condiciones, como el uso de memoria que excede un umbral, cuando la CPU está inactiva, etc., el intérprete de Python activará la ejecución del recolector de basura cíclico.

Cabe señalar que el trabajo del recolector de basura cíclico provocará cierta sobrecarga de rendimiento. Por lo tanto, al escribir código, debemos intentar evitar las referencias circulares para reducir la frecuencia y la sobrecarga de la recolección de basura.

Además, Python también proporciona gcmódulos que nos permiten tener un control más granular sobre la recolección de basura. Al ajustar gclos parámetros relevantes del módulo, podemos cambiar el comportamiento de la recolección de basura, como deshabilitar el recolector de basura cíclico, establecer el umbral para la recolección de basura, etc. Para conocer métodos de uso específicos, consulte la documentación oficial de Python.

En resumen, el mecanismo de recolección de basura de Python incluye principalmente recuento de referencias y recolectores de basura circulares. El recuento de referencias se utiliza para rastrear las referencias de un objeto. Cuando ninguna variable hace referencia al objeto, el objeto se liberará. El recolector de basura cíclico maneja la situación en la que existen referencias circulares, marcando y limpiando objetos inaccesibles. A través de estos dos mecanismos, Python puede administrar automáticamente la memoria y realizar la recolección de basura, lo que reduce la carga de los programadores.

Explicación detallada y funcionamiento práctico.

1. Problema de basura en el programa.

Se generará basura durante la ejecución del programa y esta basura afectará el rendimiento del programa. Por lo tanto, debemos limpiar esta basura a tiempo.

2. Definición de basura

En un programa, los objetos a los que no se hace referencia se consideran basura. Cuando hay demasiados objetos basura, afectará el rendimiento del programa.

3. Mecanismo automático de recolección de basura.

En Python, existe un mecanismo automático de recolección de basura. Elimina automáticamente los objetos a los que no se hace referencia, eliminando la necesidad de manejar manualmente la recolección de basura.

4. Ejemplo: utilice el método del para eliminar objetos basura

El siguiente es un código de muestra que muestra cómo eliminar objetos basura usando el método del.

class A:
    def __init__(self):
        self.name = 'A类'

    # del是一个特殊方法,它会在对象被垃圾回收前调用
    def __del__(self):
        print('A()对象被删除了~~~',self)

a = A()
b = a # 又使用一个变量b,来引用a对应的对象

print(a.name)

5. Manejar la recolección de basura manualmente

Si desea manejar la recolección de basura manualmente, puede establecer la referencia del objeto en Ninguna o usar la instrucción del para eliminar la referencia. Aquí está el código de ejemplo:

# 将a设置为了None,此时没有任何的变量对A()对象进行引用,它就是变成了垃圾
a = None
b = None

6. Finalizar el programa

Finalmente, puede agregar una línea de declaraciones de entrada al final del código para esperar a que salga la entrada del usuario después de ejecutar el programa.

input('回车键退出...')

7. Procesamiento automático de recolección de basura.

El mecanismo de recolección de basura de Python eliminará automáticamente los objetos a los que no se hace referencia sin procesamiento manual. Aquí hay un código de muestra:

# 定义一个类A
class A:
    def __init__(self):
        self.name = 'A类'

    # del是一个特殊方法,它会在对象被垃圾回收前调用
    def __del__(self):
        print('A()对象被删除了~~~',self)

# 创建一个A类的实例a并引用它
a = A()

# 打印a的名称属性值
print(a.name)

# 删除a的引用
a = None

# 程序运行结束后,会自动调用垃圾回收机制删除没有被引用的对象

Cuando finaliza el programa, Python llamará automáticamente al mecanismo de recolección de basura para eliminar objetos sin referencia. Puede ver que en el código de muestra, cuando la referencia de a se establece en Ninguna, el objeto a se convierte en un objeto basura y eventualmente será eliminado por el mecanismo de recolección de basura.

8. Finalizar el programa

Finalmente, puede agregar una línea de declaraciones de entrada al final del código para esperar a que salga la entrada del usuario después de ejecutar el programa.

input('回车键退出...')

Columnas boutique Python recomendadas


Conocimientos básicos de Python (0 introducción básica)

[Conocimientos básicos de Python] 0.función print()
[conocimientos básicos de Python] 1. Tipos de datos, aplicaciones de datos, conversión de datos
[conocimientos básicos de Python] 2. if juicio condicional y anidamiento de condiciones
[conocimientos básicos de Python] 3.funciones input()
[Conocimientos básicos de Python] 4. Listas y diccionarios
[Conocimientos básicos de Python] 5. Bucles For y while
[Conocimientos básicos de Python] 6. Valores booleanos y cuatro tipos de declaraciones (romper, continuar, pasar, demás)
[Conocimientos básicos de Python] 7. Operación práctica: use Python para implementar el juego "Word PK" (1)
[Conocimientos básicos de Python] 7. Operación práctica: use Python para implementar el juego "Word PK" (2)
[Python básico conocimiento] 8. Pensamiento de programación: cómo resolver problemas - Capítulo de pensamiento
[Conocimientos básicos de Python] 9. Definición y llamada de funciones
[Conocimientos básicos de Python] 10. Escribir programas con funciones - Capítulo práctico
[Conocimientos básicos de Python] 10. Uso de Python para implementar el juego piedra, papel y tijera - Capítulo de operación de práctica de funciones
[Conceptos básicos de Python] 11. Cómo depurar - Razones de errores comunes e ideas para la solución de problemas - Capítulo de pensamiento
[Conceptos básicos de Python] 12. Clases y objetos (1)
[Conceptos básicos de Python ] 12. Clases y objetos (2)
[Conceptos básicos de Python] Conocimiento] 13. Clases y objetos (3)
[Conocimientos básicos de Python] 13. Clases y objetos (4)
[Conocimientos básicos de Python] 14. Construcción de un sistema de gestión de biblioteca (operación práctica de clases y objetos)
[Conocimientos básicos de Python] 15. Conocimientos básicos de codificación
[Conocimientos básicos de Python] 16. Fundamentos de lectura, escritura y operaciones de archivos
[Conocimientos básicos de Python] 16. Implementación en Python de "Preguntas de dictado de poemas antiguos" (Lectura, escritura y codificación de archivos - operación práctica)
[Conocimientos básicos de Python] 17. El concepto de módulos y cómo introducirlo
[conceptos básicos de Python] 18. Operación práctica: uso de Python para enviar automáticamente correos electrónicos masivos
[conceptos básicos de Python] 19. Pensamiento del producto y uso de diagramas de flujo: pensamiento
[conceptos básicos de Python] 20. implementación de Python de "qué comer en el almuerzo" (Pensamiento de producto - Operación práctica)
[Conocimientos básicos de Python] 21. La forma correcta de abrir de manera eficiente y perezosa - Graduación
[procesamiento de archivos Python] Lectura, procesamiento y escritura de archivos CSV
[procesamiento de archivos Python ] Procesamiento automático de Excel (usando openpyxl)
[procesamiento de archivos python] -procesamiento de formato excel


conocimiento del rastreador de Python

[rastreador de python] 1. Conocimientos básicos de rastreadores
[rastreador de python] 2. Conocimientos básicos de páginas web
[rastreador de python] 3. Primera experiencia con rastreadores (análisis BeautifulSoup)
[rastreador de python] 4. Operación práctica del rastreador (rastreo de platos)
[python rastreador] 5. Operación práctica del rastreador (rastreo de letras)
[rastreador de Python] 6. Operación práctica del rastreador (solicitud de datos con parámetros)
[rastreador de Python] 7. ¿Dónde se almacenan los datos rastreados?
[rastreador de python] 8. Revise el pasado y aprenda lo nuevo
[rastreador de python] 9. Inicie sesión con cookies (cookies)
[rastreador de python] 10. Ordene al navegador que funcione automáticamente (selenium)
[rastreador de python] 11. Deje que el rastreador informarle a tiempo
[rastreador de Python] 12. Construya su ejército de rastreadores
[rastreador de Python] 13. Qué comer sin engordar (ejercicio práctico del rastreador)
[rastreador de Python] 14. Explicación del marco Scrapy
[rastreador de Python] 15. Práctica del marco Scrapy (Toma popular de rastreo de trabajos)
[rastreador de Python] 16. Resumen y revisión de los puntos de conocimiento del rastreador

Supongo que te gusta

Origin blog.csdn.net/qq_41308872/article/details/132856848
Recomendado
Clasificación