2015-02-03 13 views
22

Spesso faccio fatica a trovare i colli di bottiglia nel mio codice cython. Come posso definire il profilo delle funzioni cython riga per riga?Come profilare le funzioni di cython riga per riga

+0

Vuol il debugger Cython permetterà di mettere in pausa? Quindi puoi fare [* this *] (http://stackoverflow.com/a/378024/23771). –

risposta

26

Robert Bradshaw mi ha aiutato a ottenere lo strumento line_profiler di Robert Kern funzionante per le funzioni cdef e ho pensato di condividere i risultati su stackoverflow.

In breve, impostare un normale file .pyx e creare uno script e aggiungere quanto segue prima della chiamata allo cythonize.

from Cython.Compiler.Options import directive_defaults 

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

Inoltre, è necessario definire la C macro CYTHON_TRACE=1 modificando la configurazione extensions tale che

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

Un esempio di lavoro utilizzando la magia %%cython nel notebook iPython è qui: http://nbviewer.ipython.org/gist/tillahoffmann/296501acea231cbdf5e7

+0

Molto utile, grazie. Un dettaglio: ho trovato che line_profiler afferma che il file profilato è il file .pyx originale. Sono abbastanza sicuro di avere tutto ciò che punta al file .pyd, quindi sospetto che il profiler legga solo il contenuto di .pyd per la visualizzazione, ottenendo comunque i tempi effettivi dalla versione compilata. – Giswok

+0

Per riferimento, qui ci sono [Cython docs on line tracing] (http://docs.cython.org/src/tutorial/profiling_tutorial.html#enabling-line-tracing). –

+0

Qui c'è anche un esempio non-iPython più completo: https://github.com/cython/cython/blob/master/tests/run/line_profile_test.srctree – deef

6

Anche se non lo chiamerei veramente profilazione, c'è un'altra opzione per analizzare il tuo codice Cython eseguendo cython con -a (annotato), crea una pagina Web in cui sono evidenziati i principali colli di bottiglia. Per esempio, quando ho dimenticato di dichiarare alcune variabili:

enter image description here

Dopo aver dichiarato correttamente loro (cdef double dudz, dvdz):

enter image description here

+4

È vero, non digitando le tue variabili rallenterai il tuo codice. Ma '-a' non ti darà alcuna informazione sull'effettivo runtime ma solo se stai facendo chiamate a' python'. –

+0

Ma nel mio caso, cose come dimenticare di dichiarare una variabile nel porting di Python in codice Cython è ciò che in genere rende il codice lento, ed è un modo semplice e veloce per testare queste cose. Ecco perché l'ho chiamato "__not_ _really_ _profiling_"; è solo un semplice controllo/analisi del primo codice. – Bart

Problemi correlati