2009-03-17 22 views
45

Estoy desarrollando un módulo intrínsecamente multiproceso en Python, y me gustaría saber dónde está gastando su tiempo. cProfile solo parece perfilar el hilo principal. ¿Hay alguna forma de perfilar todos los hilos involucrados en el cálculo?¿Cómo puedo perfilar un programa multiproceso en Python?

Respuesta

28

Consulte yappi (Yet Another Python Profiler).

+0

Tenga en cuenta que mientras que yappi parece ser la respuesta correcta, es un código fuente C y necesita ser creado. No hay binarios preconstruidos en la página del proyecto. – velis

+0

@velis: Puedes usar pip: 'pip install yappi'. –

+2

¿Alguna documentación? ¿Cómo puedo ordenar los resultados para recuperar los 10 mejores consumidores de tiempo total? – Dejell

-1

No conozco ninguna aplicación de creación de perfiles que admita tal cosa para python, pero podría escribir una clase Trace que escriba archivos de registro donde se ingrese la información de cuándo se inicia una operación y cuándo finalizó. cuánto tiempo consumió.

Es una solución simple y rápida para su problema.

14

En lugar de ejecutar cProfile, puede ejecutar una instancia de cProfile por separado en cada hilo, luego combinar las estadísticas. Stats.add() hace esto automáticamente.

+0

no es genial cuando el programa se inicia y detiene muchos subprocesos en el transcurso del cálculo: requiere instrumentar todo el programa, lo que puede afectar gravemente los resultados. – rog

+3

En realidad, solo tendrías que modificar el método Thread.run(). – vartec

+0

lo que quiero decir es que la sobrecarga de crear y guardar la instancia de perfil para cada ejecución de subprocesos puede sesgar fácilmente los resultados. No creo que sea posible crear estadísticas sin guardar en un archivo. – rog

4

Si está de acuerdo con hacer un poco de trabajo extra, puede escribir su propia clase de creación de perfiles que implemente profile(self, frame, event, arg). Se llama cuando se llama a una función, y puede configurar fácilmente una estructura para recopilar estadísticas a partir de eso.

Puede usar para registrar esa función en cada hilo. Cuando se llama a la función, puede usar threading.currentThread() para ver en qué se está ejecutando. Más información (y lista para funcionar receta) aquí:

http://code.activestate.com/recipes/465831/

http://docs.python.org/library/threading.html#threading.setprofile

1

Dado que las principales funciones de los diferentes hilos difieren, puede utilizar la gran ayuda profile_func() decorador de here.

Cuestiones relacionadas