He estado usando cProfile para perfilar mi código y ha funcionado muy bien. También uso gprof2dot.py para visualizar los resultados (lo hace un poco más claro).
Sin embargo, cProfile (y la mayoría de los otros perfiladores de Python que he visto hasta ahora) parecen solo perfilar en el nivel de llamada de función. Esto causa confusión cuando se llaman a ciertas funciones desde diferentes lugares; no tengo idea si la llamada n. ° 1 o la llamada n. ° 2 están ocupando la mayor parte del tiempo. Esto empeora aún más cuando la función en cuestión tiene seis niveles de profundidad, llamada desde otros siete lugares.
¿Cómo obtengo un perfil línea por línea?
En lugar de esto:
function #12, total time: 2.0s
Me gustaría ver algo como esto:
function #12 (called from somefile.py:102) 0.5s
function #12 (called from main.py:12) 1.5s
cProfile muestra cuánto del tiempo total se "transfiere" al padre, pero nuevamente esta conexión se pierde cuando tienes un montón de capas y llamadas interconectadas.
Idealmente, me encantaría tener una GUI que analizara los datos y luego me mostrara mi archivo fuente con el tiempo total asignado a cada línea. Algo como esto:
main.py:
a = 1 # 0.0s
result = func(a) # 0.4s
c = 1000 # 0.0s
result = func(c) # 5.0s
Entonces podría hacer clic en la segunda llamada "func (c)" para ver qué está ocupando tiempo en esa llamada, separada de la llamada "func (a)".
¿Tiene sentido? ¿Existe alguna biblioteca de perfiles que recopile este tipo de información? ¿Hay alguna herramienta increíble que me haya perdido?
fuente
pstats.print_callers
. Un ejemplo está aquí .Respuestas:
Creo que para eso está destinado el perfil de línea de Robert Kern . Desde el enlace:
¡Espero que ayude!
fuente
import line_profiler;
y entonces ?También puede usar pprofile ( pypi ). Si desea crear un perfil de la ejecución completa, no es necesario modificar el código fuente. También puede perfilar un subconjunto de un programa más grande de dos formas:
alternar la creación de perfiles al llegar a un punto específico en el código, como:
alternar la generación de perfiles de forma asíncrona desde la pila de llamadas (requiere una forma de activar este código en una aplicación considerada, por ejemplo, un controlador de señales o un hilo de trabajo disponible) mediante el uso de perfiles estadísticos:
El formato de salida de la anotación de código es muy parecido al perfilador de líneas:
Tenga en cuenta que debido a que pprofile no depende de la modificación del código, puede perfilar declaraciones de módulo de nivel superior, lo que permite perfilar el tiempo de inicio del programa (cuánto tiempo lleva importar módulos, inicializar globales, ...).
Puede generar una salida con formato cachegrind, por lo que puede usar kcachegrind para buscar resultados grandes fácilmente.
Divulgación: soy el autor del perfil.
fuente
Puede tomar la ayuda del paquete line_profiler para esto
1. Primero instale el paquete:
2. Use el comando mágico para cargar el paquete en su entorno python / notebook
3. Si desea perfilar los códigos para una función,
haga lo siguiente:
obtendrá una buena salida formateada con todos los detalles si sigue estos pasos :)
fuente
Solo para mejorar la respuesta mencionada anteriormente de @Joe Kington .
Para Python 3.x , use line_profiler :
Instalación:
Uso:
Suponga que tiene el programa
main.py
y dentro de él, funcionesfun_a()
yfun_b()
que desea perfilar con respecto al tiempo; deberá utilizar el decorador@profile
justo antes de las definiciones de funciones. Por ejemplo,El programa puede perfilarse ejecutando el comando de shell:
Los argumentos se pueden recuperar usando
$ kernprof -h
Los resultados se imprimirán en la consola como:
EDITAR: Los resultados de los perfiladores se pueden analizar utilizando el paquete TAMPPA . Usándolo, podemos obtener gráficos deseados línea por línea como
fuente
PyVmMonitor tiene una vista en vivo que puede ayudarlo allí (puede conectarse a un programa en ejecución y obtener estadísticas de él).
Ver: http://www.pyvmmonitor.com/
fuente