Ich habe oft Mühe, Engpässe in meinem cython
Code zu finden. Wie kann ich cython
Funktionen Zeile für Zeile profilieren?So profilieren Sie Cython-Funktionen Zeile für Zeile
Antwort
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
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
Als Referenz finden Sie hier die [Cython docs on line tracing] (http://docs.cython.org/src/tutorial/profiling_tutorial.html#enabling-line-tracing). –
Hier gibt es auch ein vollständigeres Nicht-iPython-Beispiel: https://github.com/cython/cython/blob/master/tests/run/line_profile_test.srctree – deef
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:
Nachdem sie richtig erklären (cdef double dudz, dvdz
):
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. –
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
Hat der cython Debugger erlauben Sie es zu anhalten? Dann können Sie [* this *] (http://stackoverflow.com/a/378024/23771) tun. –