¿La creación efectiva de Cython cProfiling implica escribir muchas funciones secundarias?

Estoy tratando de optimizar un código con Cython, pero cPerfil no está proporcionando suficiente información.

Para hacer un buen trabajo en la generación de perfiles, ¿debo crear muchas subrutinas func2, func3,... , func40 ?

Tenga en cuenta a continuación que tengo una función func1 in mycython.pyx, pero tiene muchos bucles for y manipulaciones internas. Pero cProfile no me dice las estadísticas de esos bucles.

     2009 function calls in 81.254 CPU seconds

Ordered by: standard name

ncalls  tottime  percall  cumtime  percall filename:lineno(function)
    1    0.000    0.000   81.254   81.254 <string>:1(<module>)
    2    0.000    0.000    0.021    0.010 blah.py:1495(len)
 2000    0.000    0.000    0.000    0.000 blah.py:1498(__getitem__)
    1    0.214    0.214    0.214    0.214 mycython.pyx:718(func2)
    1   80.981   80.981   81.216   81.216 mycython.pyx:743(func1)
    1    0.038    0.038   81.254   81.254 {mycython.func1}
    2    0.021    0.010    0.021    0.010 {len}
    1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}

preguntado el 12 de junio de 12 a las 22:06

Parece que la operación que consume más tiempo involucra la manipulación de cadenas de todos modos, por lo que tal vez debería concentrarse en acceder a su cadena a través de un algoritmo más eficiente. -

Estoy tratando de seguir los principios de la optimización, dice, no optimizarás sin el perfil primero:

Solo estoy mirando la primera línea de su perfil, lo que sugiere que cualquier optimización que vaya a hacer. ¿Tienen que venir del archivo/biblioteca? <string> (No estoy muy seguro de qué objeto es). Dicho esto, me gusta la forma en que lo expresaste. -

@JeffTratner tenga en cuenta que el perfil está ordenado por nombre, no en orden descendente de tiempo. Parece que las operaciones de cadena toman exactamente tanto tiempo como la llamada a mycython.func1. -

2 Respuestas

Sí, lo hace. La granularidad más fina disponible para cProfile es una llamada de función. Debe dividir func1 en varias funciones. (Tenga en cuenta que puede hacer que sean funciones definidas dentro de func1 y, por lo tanto, solo disponibles para func1).

Si desea un perfilado más detallado (nivel de línea), entonces necesita un perfilador diferente. Echa un vistazo a este perfilador de nivel de línea, pero no creo que funcione para Cython.

Respondido el 12 de junio de 12 a las 22:06

Gracias. Ok, eché un vistazo a line_profiler y funciona bien para python pero sí, los documentos no mencionan el uso específicamente con Citón. Y el compilador de Cython se quejaba de la arbitrariedad @perfil decoradores que este perfilador necesita usar. - Oye, mira esto

Voté tu respuesta. Estaré separando mi código con funciones adicionales, para trabajar con cProfile. Gracias. - Oye, mira esto

@HeyWatchThis perfilador de líneas de Robert Kern no funciona con Cython - kynan

@kynan: Cython 0.23 admite el rastreo de líneas y parece trabajar con line_profiler. - Ioannis Filippidis

Debe habilitar la compatibilidad con la generación de perfiles para su código Cython. Usar

# cython: profile=True

http://docs.cython.org/src/tutorial/profiling_tutorial.html

Respondido el 04 de Septiembre de 12 a las 18:09

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.