7

OK, entonces estamos desarrollando una aplicación relacionada con la red donde el usuario puede cargar sus propios scripts de python para decidir por un algoritmo. Nuestro código contiene módulos c, cython y python.¿La recolección de basura hace que python sea más lento?

Como evitar la latencia, la huella de memoria y el procesamiento mínimo es fundamental para nosotros, nos preguntamos si es inteligente y eficaz (en cuanto al rendimiento) desactivar la recolección de elementos no utilizados y gestionar la desasignación de memoria.

+3

¿Cómo sabríamos la calidad de los programadores que tiene/son? Puede empeorarlo fácilmente al introducir fugas de memoria. – Blindy

+0

¿Cómo se propone "desactivar" la recolección de basura que se integra directamente en la VM de cython? –

+0

suponiendo buenos programadores que no introducen fugas de memoria, doble gratis. Solo quiero saber si la desasignación manual sería menos eficiente o más. Estaba leyendo en alguna parte que el recolector de basura de pitones usa técnicas como no llamar gratis cada vez, sino por una combinación de cosas. No estoy seguro en qué medida eso es cierto. – theRealWorld

Respuesta

11

gc.disable se apaga sólo el recolector de basura cíclica. Los objetos se seguirán recolectando cuando el refcount caiga a cero de todos modos. Entonces, a menos que tenga muchas referencias cíclicas, no hará ninguna diferencia.

¿Está hablando de hacer una creación personalizada de Python y deshabilitar el GC de recuento de ref?

+0

En general, ¿qué tan lento es el conteo de ref GC? – theRealWorld

18

Simplemente deje que el idioma haga lo que quiere hacer, y si encuentra que tiene un problema real, vuelva y publique al respecto. De lo contrario, es una optimización prematura.

+0

¡Esto es muy, muy cierto! –

5

Solo desarrolla la aplicación para que sea funcionalmente correcta. Una vez que tienes una aplicación correcta, inicia el generador de perfiles y determina dónde están los bits lentos. Si le preocupa el rendimiento del script del usuario, probablemente se esté centrando en algo equivocado.

Una respuesta más breve es que probablemente sea poco inteligente e ineficaz intentar optimizar antes de que se complete el desarrollo inicial.

4

La recolección de basura hace que todo sea más lento. También hace que todo sea mucho menos propenso a errores. Especialmente si el objetivo es ejecutar scripts cargados por el usuario, me cuesta creer que la compensación funcionará bien; si tiene alguna fuga o doble libertad, ahora tiene una vulnerabilidad DoS si alguien puede descubrir cómo desencadenarla.

1

CPython (el Python original y más usado) utiliza un enfoque de recuento de referencias para la recolección de basura: los objetos que ya no se referencian se liberan inmediatamente. Por lo tanto, si no crea ningún ciclo, el recolector de elementos no utilizados, que solo existe para detectar ciclos, no debería invocarse demasiado.

2

He pasado bastante tiempo trabajando en idiomas con recolección automática de basura y puedo decir casi unilateralmente que confiar en la recolección de basura nativa será más rápido y más confiable que una solución personalizada.

Cuestiones relacionadas