¿Cuándo se recolectan los objetos en Python?

¿Cuándo se recolectan los objetos en Python? ¿Cuándo se libera la memoria y la colección afecta el rendimiento? ¿Se puede optar o sintonizar el algoritmo gc y, en caso afirmativo, cómo?

Aquí hay un extracto de la referencia del lenguaje.

Los objetos nunca son destruidos explícitamente; sin embargo, cuando se vuelven inalcanzables, pueden ser recolectados en la basura. Se permite una implementación para posponer la recolección de basura u omitirla por completo . Es una cuestión de calidad de implementación cómo se implementa la recolección de basura, siempre y cuando no se recolecten objetos a los que se pueda acceder.

Detalle de la implementación de CPython : CPython actualmente utiliza un esquema de conteo de referencias con (opcional) detección retardada de basura enlazada cíclicamente, que recolecta la mayoría de los objetos tan pronto como se vuelven inalcanzables, pero no se garantiza que recolecte basura que contenga referencias circulares. Consulte la documentación del módulo gc para obtener información sobre cómo controlar la recolección de basura cíclica. Otras implementaciones actúan de manera diferente y CPython puede cambiar. No dependa de la finalización inmediata de los objetos cuando se vuelven inalcanzables (por ejemplo, siempre cierre los archivos).

EDITAR: Acerca de posponer la recolección de basura … el módulo gc permite interactuar con el recolector de basura, y deshabilitarlo si lo desea y cambiar la frecuencia de recolección, etc. Pero no lo he usado yo mismo. Además, los ciclos que contienen objetos con métodos __del__ no se recostackn .

¿Cuándo se recolectan los objetos en Python?

Hay muchos detalles en el código fuente de CPython: http://svn.python.org/view/python/trunk/Modules/gcmodule.c?revision=81029&view=markup

Cada vez que un recuento de referencia cae a cero, el objeto se elimina inmediatamente.

293 / * El gc cíclico de Python nunca debería ver un refcount entrante

294 * de 0: si algo decrece a 0, debería haber sido

295 * desasignado inmediatamente en ese momento.

Se desencadena una colección completa cuando el número de objetos nuevos supera el 25% del número de objetos existentes.

87 Además de los diversos umbrales configurables, solo activamos un

88 colección completa si la relación

89 long_lived_pending / long_lived_total

90 está por encima de un valor dado (cableado al 25%).

¿Cuándo se libera la memoria?

Solo pude pescar esta información.

781 / * Borrar todas las listas libres

782 * Todas las listas gratuitas se borran durante la recostackción de la generación más alta.

783 * Los elementos asignados en la lista libre pueden mantener ocupado un pymalloc arena.

784 * Borrar las listas libres puede devolverle la memoria al sistema operativo antes.

785 * /

De acuerdo con esto, Python puede mantener su objeto en una lista gratuita para su reciclaje, incluso si deja caer su referencia a cero. No puedo encontrar explícitamente cuándo se realiza la llamada gratuita para devolver la memoria al sistema operativo, pero me imagino que esto se hace cada vez que se realiza una recostackción y el objeto no se mantiene en una lista gratuita.

¿La colección tiene un impacto en el rendimiento?

Cualquier recolector de basura no trivial del que haya oído hablar requiere CPU y memoria para funcionar. Por lo tanto, sí, siempre hay un impacto en el rendimiento. Tendrás que experimentar y conocer a tu recolector de basura.

Progtwigs que requieren capacidad de respuesta en tiempo real con los que me he encontrado, ya que los recolectores de basura no me otorgan control sobre cuándo se ejecutan o por cuánto tiempo lo hacen. Algunos casos peculiares también pueden causar un uso excesivo de la memoria, por ejemplo, la habilidad de Python para mantener listas libres.