2015-02-03 4 views

Antwort

26

Robert Bradshaw half mir Robert Kerns line_profiler Werkzeug zu arbeiten für cdef Funktionen und ich dachte, ich würde die Ergebnisse auf stackoverflow teilen.

Kurz gesagt, richten Sie eine reguläre .pyx Datei und Build-Skript und fügen Sie die folgenden vor Ihrem Anruf zu cythonize.

from Cython.Compiler.Options import directive_defaults 

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

Darüber hinaus müssen Sie die C-Makro CYTHON_TRACE=1 indem Sie Ihren extensions Setup definieren, so dass

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

Ein Arbeitsbeispiel der %%cython Magie in der iPython Notebook ist hier: http://nbviewer.ipython.org/gist/tillahoffmann/296501acea231cbdf5e7

+0

Sehr hilfreich, danke. Ein Detail: Ich habe festgestellt, dass line_profiler angibt, dass die profilierte Datei die ursprüngliche .pyx-Datei ist. Ich bin mir ziemlich sicher, dass alles auf den .pyd zeigt, also vermute ich, dass der Profiler nur den Inhalt aus dem .pyd zur Anzeige liest, während er immer noch die tatsächlichen Timings von der kompilierten Version erhält. – Giswok

+0

Als Referenz finden Sie hier die [Cython docs on line tracing] (http://docs.cython.org/src/tutorial/profiling_tutorial.html#enabling-line-tracing). –

+0

Hier gibt es auch ein vollständigeres Nicht-iPython-Beispiel: https://github.com/cython/cython/blob/master/tests/run/line_profile_test.srctree – deef

6

Obwohl ich es nicht wirklich Profiling nennen würde, gibt es eine andere Möglichkeit, Ihren Cython-Code zu analysieren, indem Sieausführen 0 mit -a (kommentieren), erstellt dies eine Webseite, auf der die wichtigsten Flaschenhälse hervorgehoben sind. Zum Beispiel, wenn ich vergessen einige Variablen zu deklarieren:

enter image description here

Nachdem sie richtig erklären (cdef double dudz, dvdz):

enter image description here

+4

Richtig, wenn Sie Ihre Variablen nicht eingeben, wird der Code langsamer. Aber '-a' gibt Ihnen keine Informationen über die tatsächliche Laufzeit, sondern nur, ob Sie' Python'-Aufrufe machen. –

+0

Aber in meinem Fall, Dinge wie vergessen, eine Variable bei der Portierung von Python auf Cython-Code zu deklarieren ist, was normalerweise den Code langsam macht, und es ist eine schnelle und einfache Möglichkeit, um diese Dinge zu testen. Deshalb habe ich es "_not_ _really_ _profiling_" genannt; Es ist nur eine einfache erste Code-Prüfung/Analyse. – Bart