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
risposta
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
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
Per riferimento, qui ci sono [Cython docs on line tracing] (http://docs.cython.org/src/tutorial/profiling_tutorial.html#enabling-line-tracing). –
Qui c'è anche un esempio non-iPython più completo: https://github.com/cython/cython/blob/master/tests/run/line_profile_test.srctree – deef
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:
Dopo aver dichiarato correttamente loro (cdef double dudz, dvdz
):
È 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'. –
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
Vuol il debugger Cython permetterà di mettere in pausa? Quindi puoi fare [* this *] (http://stackoverflow.com/a/378024/23771). –