¿Existe un generador de perfiles visual para Python? [cerrado]

99

Ahora uso cProfile, pero me resulta tedioso escribir código pstats solo para consultar los datos estadísticos.

Estoy buscando una herramienta visual que me muestre lo que hace mi código Python en términos de tiempo de CPU y asignación de memoria.

Algunos ejemplos del mundo Java son visualvm y JProfiler .

Conozco KCachegrind para Linux, pero preferiría algo que pueda ejecutar en Windows / Mac sin instalar KDE.

Frederik
fuente
5
Si un programa como este aún no existe, sería un gran proyecto de código abierto.
carl
@cvondrick Existe un programa como este, y ya se mencionó: KCachegrind.
Devin Jeanpierre
1
@Devin, sí, pero mira la pregunta. :-)
carl
¿Conoce esta técnica? Stackoverflow.com/questions/375913/… No es visual, pero tampoco es tediosa, y es difícil de superar por su efectividad.
Mike Dunlavey
4
Amantes de @KCacheGrind: Cualquier razón para no tener que instalar KDE es una buena razón para no usar KCacheGrind.
Matt Joiner

Respuestas:

86

Un amigo y yo hemos escrito un visor de perfiles de Python llamado SnakeViz que se ejecuta en un navegador web. Si ya está utilizando RunSnakeRun, es posible que SnakeViz no agregue tanto valor, pero SnakeViz es mucho más fácil de instalar.

Editar: SnakeViz es compatible con Python 2 y 3 y funciona en todos los sistemas principales.

jiffyclub
fuente
41

Solo conozco RunSnakeRun .

También se habló hace algún tiempo sobre un generador de perfiles integrado en PyDev (Eclipse), pero no sé si eso alguna vez verá la luz del día.

Actualización: Desafortunadamente, parece que RunSnakeRun ya no se mantiene y no es compatible con Python 3.

nikow
fuente
+1 para RunSnakeRun. La mejor herramienta en mi humilde opinión.
Codeape
4
RunSnakeRun es bueno, pero desafortunadamente no funciona actualmente en Python 3. (Verdadero para junio de 2014.)
Ram Rachum
@Ram: Gracias por la información, eso es lamentable :-(.
nikow
1
En su lugar, he usado pyinstrument. Es un animal diferente, pero es útil.
Ram Rachum
Me gusta RunSnakeRun, pero no me gusta mucho cómo muestra a las personas que llaman y las llamadas. RunSnakeRun mostrará los valores "totales" para el recuento de llamadas, la hora local y el tiempo acumulado para cada persona que llama. Por lo tanto, puede tener cosas como una función que tiene un tiempo acumulativo de 5 segundos, pero una llamada que tiene un tiempo acumulativo de 100 segundos. No es tan intuitivo ni tan útil como lo que proporciona pstats. pstats utiliza información contextual relacionada con la función en cuestión para proporcionar números más significativos para las estadísticas de la persona que llama / destinataria. No tengo conocimiento de otro espectador que lo haga fácilmente visible.
Vultaire
14

Yo uso gprof2dot.py. El resultado se ve así . Yo uso esos comandos:

  python -m cProfile -o profile.dat my_program.py
  gprof2dot.py -f pstats profile.dat | dot -Tpng -o profile.png

Necesita graphviz y gprof2dot.py instalados. Puede que le guste un script de shell de conveniencia .

maxy
fuente
Si genera svg en lugar de png (con punto -Tsvg -o profile.svg) podrá buscar el gráfico de salida con su navegador y podrá escalar la imagen sin irregularidades.
razeh
8

Spyder también proporciona una interfaz gráfica de usuario bastante agradable para cProfile:

ingrese la descripción de la imagen aquí

jsexauer
fuente
2
¿Cómo se carga un perfil existente?
Clément
4

Esta persona creó un perfil gráfico, que se describe aquí . Tal vez puedas usar eso como punto de partida para tu propio trabajo.

PaulMcG
fuente
1
Eso es muy bueno, pero aparentemente solo para C / C ++. Sin embargo, usa Python.
Rory
4

KCacheGrind incluye una versión llamada QCacheGrind que se ejecuta en Mac OS X y en Windows .

akaihola
fuente
Además, OP parece malinterpretar las dependencias de KCachegrind en Linux. En Debian / Ubuntu / Mint, todo lo que necesita es apt-get install kcachegrindinstalar solo 3 bibliotecas relacionadas con KDE.
saaj
2
@saaj en la instalación de Ubuntu 17.04, apt install kcachegrindquiere instalar 102 paquetes, incluidas ~ 40 bibliotecas de KDE.
Mark E. Haase
@mehaase En fresco ubuntu:xenial, puede ser tres veces más, pero es para un entorno de desarrollo y apenas lo veo como un problema. Y en realidad apt-cache depends --recurse --no-recommends --no-suggests --no-conflicts --no-breaks --no-replaces --no-enhances --no-pre-depends kcachegrind | grep kde | grep Depends | sort -u | wc -ldice solo 13.
saaj
2

Python Call Graph genera imágenes muy similares a las de la respuesta de maxy . También muestra el tiempo total para cada función, por alguna razón no se refleja en los gráficos de ejemplo.

Lev Levitsky
fuente
1

Escribí una herramienta de visualización basada en navegador, profile_eye , que opera en la salida de gprof2dot .

gprof2dot es excelente para asimilar muchas salidas de herramientas de creación de perfiles y hace un gran trabajo en la ubicación de elementos gráficos. La representación final es un gráfico estático, que a menudo está muy desordenado.

Usando d3.js es posible eliminar gran parte de ese desorden, a través del desvanecimiento relativo de elementos desenfocados, información sobre herramientas y una distorsión de ojo de pez .

Para comparar, vea la visualización de profile_eye del ejemplo canónico usado por gprof2dot . Para Python en particular, vea un ejemplo de salida de cProfile .

Ami Tavory
fuente
1

Considere pyflame + flamegraph

Pyflame: un perfilador de Ptracing para Python + flamegraph

https://github.com/uber/pyflame

Puede rastrear hacia un proceso de Python en ejecución usando pyflame.

McKelvin
fuente
0

He usado plop y lo encontré muy ligero. Da una idea rápida del perf.

auny
fuente
vprof es una herramienta similar que también usa el flamegraph, pero también puede crear perfiles de memoria. Desafortunadamente, solo muestra el tiempo acumulado y no el tiempo total dedicado a una función.
goodmami