¿Cómo perfilar mi código?

Quiero saber cómo perfilar mi código.

He revisado los documentos, pero como no se dieron ejemplos, no pude obtener nada de ellos.

Tengo un código grande y está tomando mucho tiempo, por lo tanto quiero hacer un perfil y boost su velocidad. No he escrito mi código en el método, hay pocos en el medio pero no completamente. No tengo ningún main en mi código. Quiero saber cómo usar el perfilado. Estoy buscando algún ejemplo o código de ejemplo sobre cómo hacer un perfil.

Intenté psyco, es decir, solo agregué dos líneas en la parte superior de mi código:

import psyco psyco.full() 

¿Es esto correcto? No mostró ninguna mejora. Cualquier otra forma de acelerar, por favor sugerir.

La respuesta estándar a esta pregunta es usar cProfile .

Sin embargo, encontrará que sin tener su código separado en métodos que cProfile no le dará información particularmente rica .

En su lugar, es posible que desee probar lo que otro cartel aquí llama Perfil de Monte Carlo . Para citar de otra respuesta :

Si tiene prisa y puede interrumpir manualmente su progtwig bajo el depurador mientras está siendo subjetivamente lento, hay una manera simple de encontrar problemas de rendimiento.

Solo deténgalo varias veces, y cada vez que mire la stack de llamadas. Si hay algún código que está perdiendo algún porcentaje del tiempo, 20% o 50% o lo que sea, esa es la probabilidad de que lo atrape en el acto en cada muestra. Así que eso es aproximadamente el porcentaje de muestras en las que lo verá. No hay conjeturas educadas requeridas. Si tiene una idea de cuál es el problema, esto lo probará o lo desaprobará.

Puede tener múltiples problemas de rendimiento de diferentes tamaños. Si limpia alguno de ellos, los restantes tomarán un porcentaje mayor y serán más fáciles de detectar en pases posteriores.

Advertencia: los progtwigdores tienden a ser escépticos de esta técnica a menos que la hayan usado ellos mismos. Dirán que los perfiladores le brindan esta información, pero eso solo es cierto si muestrean toda la stack de llamadas. Los gráficos de llamadas no le dan la misma información, porque 1) no se resumen en el nivel de instrucción, y 2) dan resúmenes confusos en presencia de recursión. También dirán que solo funciona en progtwigs de juguetes, cuando en realidad funciona en cualquier progtwig, y ​​parece funcionar mejor en progtwigs más grandes, porque tienden a tener más problemas para encontrar [ énfasis agregado ].

No es ortodoxo, pero lo he usado con mucho éxito en un proyecto donde el uso de perfiles de cProfile no me daba resultados útiles.

Lo mejor de esto es que esto es muy fácil de hacer en Python. Simplemente ejecute su script de Python en el intérprete, presione [Control-C], anote el rastreo y repítalo varias veces.

Editar:

Esta respuesta se ha implementado en https://github.com/campos-ddc/cprofile_graph

Perfilando con cProfile

Aquí hay una publicación que escribí hace algún tiempo sobre la creación de perfiles con cProfile con alguna ayuda gráfica.

cProfile es uno de los perfiladores de python más utilizados, y aunque es muy potente, la salida de texto estándar es algo deslustrada. Aquí te mostraré cómo usar cProfile en tu aplicación de una manera más fácil.

Hay dos formas comunes de usar cProfile, puede usarlo como un comando para indicar un módulo determinado, o puede usarlo dentro de su código, para perfilar fragmentos de código específicos.

Perfilando un modulo

Para usar cProfile para perfilar un módulo completo, simplemente use el siguiente comando en su indicador:

 python -m cProfile -o output_filename.pstats path/to/script arg1 arg2 

Esto ejecutará su módulo con los argumentos dados (son opcionales) y volcará la salida en output_filename.pstats.

Hay muchas maneras de leer los datos en ese archivo de salida, pero para el propósito de esta publicación, no nos preocupemos por eso y enfoquémonos en obtener esa visualización gráfica.

Perfilado desde dentro

A veces no quieres perfilar un módulo completo, solo unas pocas líneas de él.

Para hacerlo, tendrá que agregar algún código a su módulo.

Ante todo:

 import cProfile 

Y luego, puede reemplazar cualquier segmento de código con lo siguiente:

 cProfile.runctx('Your code here', globals(), locals(), 'output_file') 

Por ejemplo, aquí hay una prueba antes y después de perfilar:

 import unittest class Test(unittest.TestCase): def testSomething(self): self.DoSomethingIDontCareAbout() param = 'whatever' self.RunFunctionIThinkIsSlow(param) self.AssertSomeStuff() # This is after all, a test 

Después:

 import unittest import cProfile class Test(unittest.TestCase): def testSomething(self): self.DoSomethingIDontCareAbout() param = 'whatever' cProfile.runctx( 'self.RunFunctionIThinkIsSlow(param)', globals(), locals(), 'myProfilingFile.pstats' ) self.AssertSomeStuff() # This is after all, a test 

Convertir un archivo pstats a un gráfico

Para convertir su archivo de perfiles en un gráfico, necesitará un par de cosas:

  • gprof2dot : este módulo convertirá su salida en un archivo de puntos , un formato de archivo estándar para descripciones de gráficos.
  • GraphViz : Convierte tu archivo de puntos en una imagen.

Después de descargar gprof2dot e instalar GraphViz , ejecute este comando en su indicador:

 python gprof2dot -f pstats myProfileFile | dot -Tpng -o image_output.png 

Puede que tenga que usar una ruta completa para gprof2dot y / o dot , o puede agregarlos a su variable PATH env.

Después de todo esto, deberías tener una imagen que se vea así:

ejemplo de resultados

  • Los colores más cálidos (rojo, naranja, amarillo) indican funciones que ocupan más del tiempo de ejecución total que los colores más fríos (verde, azul)

  • En cada nodo, puede ver qué porcentaje del tiempo de ejecución total usó esa función y cuántas veces se llamó.

  • Las flechas entre los nodos indican qué función se llama otras funciones, y dichas flechas también tienen un título que indica qué porcentaje del tiempo de ejecución llegó hasta allí.

Nota: los porcentajes no siempre se sumn hasta el 100%, especialmente en las secciones de código que hacen referencia al código C ++, que no se perfilan. cProfile tampoco podrá determinar qué se llama desde dentro de una statement “eval”, por lo que es posible que vea algunos saltos en su gráfico.

Utilice cProfile . Puede usarlo desde la línea de comando y pasar su módulo como parámetro, por lo que no necesita un método main .