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
- 1. Come posso profilare il codice Python riga per riga?
- 2. Come posso utilizzare XHProf per profilare i test PHPUnit dalla riga di comando?
- 3. Come leggere il file riga per riga
- 4. GZIPInputStream lettura riga per riga
- 5. Lettura dell'input riga per riga
- 6. Chiamata di funzioni Cython C da Python
- 7. Come leggere riga per riga da un'area di testo
- 8. Come ignorare le interruzioni di riga?
- 9. Contatore riga/colonna nelle funzioni 'applica'
- 10. Java: Come leggere un file riga per riga ignorando "\ n"
- 11. Come chiamare direttamente le funzioni C di numpy/scipy da Cython, senza sovraccarico di chiamata Python?
- 12. Chiamare le funzioni template C++ esterne in Cython
- 13. R - Lettura STDIN riga per riga
- 14. Leggere un file riga per riga
- 15. Indici ordine riga-riga
- 16. Leggi riga per riga in script bash
- 17. dividere numpy riga per riga somma
- 18. Yii2 Gridview riga per riga espressione css
- 19. Leggi gzip stream riga per riga
- 20. Come chiamare le funzioni MATLAB dalla riga di comando di Linux?
- 21. Ordinamento riga per poligoni
- 22. WIX: Come selezionare le funzionalità dalla riga di comando
- 23. Come profilare un'app per dart?
- 24. Applicare la patch riga per riga
- 25. Lettura/Analizza file di testo riga per riga in VBA
- 26. Migliorare il file di lettura di C++ riga per riga?
- 27. Come si legge un file gzip riga per riga?
- 28. Come leggere un file .gz riga per riga in C++?
- 29. Come leggere da un child_process riga per riga in Node.js?
- 30. Come leggere riga per riga nel file pdf usando PyPdf?
Vuol il debugger Cython permetterà di mettere in pausa? Quindi puoi fare [* this *] (http://stackoverflow.com/a/378024/23771). –