Cómo perfilar las funciones de cython línea por línea


A menudo me cuesta encontrar cuellos de botella en mi código cython. ¿Cómo puedo perfilar cython funciones línea por línea?

Author: Till Hoffmann, 2015-02-03

2 answers

Robert Bradshaw me ayudó a conseguir la herramienta de Robert Kern line_profiler trabajando para cdef funciones y pensé en compartir los resultados en stackoverflow.

En resumen, configure un archivo .pyx regular y el script de compilación y agregue lo siguiente antes de su llamada a cythonize.

from Cython.Compiler.Options import directive_defaults

directive_defaults['linetrace'] = True
directive_defaults['binding'] = True

Además, debe definir la macro C CYTHON_TRACE=1 modificando su configuración extensions de manera que

extensions = [
    Extension("test", ["test.pyx"], define_macros=[('CYTHON_TRACE', '1')])
]

Un ejemplo de trabajo usando la magia %%cython en el cuaderno iPython es aqui: http://nbviewer.ipython.org/gist/tillahoffmann/296501acea231cbdf5e7

 29
Author: Till Hoffmann,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-29 13:49:55

Aunque realmente no lo llamaría perfilado, hay otra opción para analizar su código de Cython ejecutando cython con -a (anotar), esto crea una página web en la que se resaltan los principales cuellos de botella. Por ejemplo, cuando olvido declarar algunas variables:

introduzca la descripción de la imagen aquí

Después de declararlos correctamente(cdef double dudz, dvdz):

introduzca la descripción de la imagen aquí

 7
Author: Bart,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-20 10:57:33