Saltar al contenido

Usar un enfoque de alto nivel para un perfil rápido en Python

Es posible que los pasos uno y dos no hayan producido ningún aumento útil de rendimiento. Así que, ahora es el momento de bajar un nivel y reducir una sola función en la que centrarse.

Echa otro vistazo a la salida del perfil del primer paso. Encuentra la función con la mayor columna de porcentaje. Ahora, haz un perfil de cada línea de esta función para ver si hay algo lento que pueda ser fácilmente refactorizado.

Usar un enfoque de alto nivel para un perfil rápido en Python
Usar un enfoque de alto nivel para un perfil rápido en Python

Para este paso se necesitan algunas herramientas de perfilado adicionales:

  1. Perfil de línea
  2. Kernprof.py

Puedes encontrar alguna documentación sobre lo anterior aquí. En general, he encontrado que estos son un poco incómodos de usar y la documentación es un poco escasa. Afortunadamente, este sencillo enfoque de la elaboración de perfiles no necesita demasiada documentación.

El primer paso, y probablemente el más incómodo, es colocar al decorador de @perfil alrededor de la función que te interesa perfilar. No te preocupes, no hay nada que importar para @profile porque es mágico .

A continuación, ejecuta el script kernprof.py con tu script/aplicación como argumento:

1`kernprof.py -v -l <script;<your_script_args;`.

pitón

Ahora, realice las operaciones que harán que se ejecute la función perfilada.

Finalmente, podemos usar el módulo line_profiler para ver los resultados. La anterior invocación del script kernprof.py creó un archivo de datos de perfilador, típicamente llamado .lprof.

Alimenta este archivo de datos al módulo line_profiler, e imprimirá el tiempo de la función desglosado por línea:

1`python -m line_profiler <data_file>`

pitón

En este punto, probablemente verán algunas líneas que sobresalen, en lo que respecta a las columnas de Tiempo y % de Tiempo. En mi experiencia, la lentitud en este nivel tiende a ser algo así como la construcción de una lista con muchos elementos, la búsqueda constante de la existencia de un elemento en una gran lista, y otras operaciones que se ocupan de grandes iterables.