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
- 1. So lesen Sie eine Datei Zeile für Zeile Zeile für Zeile:
- 2. Vergleichen Sie zwei Textdateien, Zeile für Zeile
- 3. MPI_File_read_at Zeile für Zeile
- 4. So lesen Sie eine Datei Zeile für Zeile und teilen jede Zeile
- 5. Java Zeile für Zeile ausführen
- 6. DataReader Wert Zeile für Zeile
- 7. GZIPInputStream Zeile für Zeile lesen
- 8. PyCharm: Zeile für Zeile debuggen?
- 9. Perl Zeile für Zeile lesen
- 10. Python pdf Zeile für Zeile
- 11. Eingabe Zeile für Zeile lesen
- 12. JetBrains dotTrace, ist es möglich, Quellcode Zeile für Zeile zu profilieren? sonst brauche ich ein anderes Werkzeug
- 13. Speichern Sie Textdatei Inhalt Zeile für Zeile in Array
- 14. Verketten Sie zwei mehrzeilige Zeichenfolgen Zeile für Zeile
- 15. So entfernen Sie nachgestellte leere Zeile/Spalten
- 16. Vergleichen Sie zwei Dateien Zeile für Zeile in Python
- 17. So fügen Sie eine Zeile in Javascript
- 18. Zugriff Zeile für Zeile Prozent von Gesamt
- 19. Lese Zeile für Zeile in String Array
- 20. Lese Zeile für Zeile von STDIN
- 21. Edit Pandas Datenrahmen Zeile für Zeile
- 22. Schreiben Sie Daten Zeile für Zeile auf iPhone
- 23. Können Sie Zeile für Zeile in Javascript lesen?
- 24. Markieren Sie eine Zeile in jeder Zeile
- 25. Textdatei: Zeile für Zeile lesen C#
- 26. lesen Zeile für Zeile in Bash-Skript
- 27. So kommentieren Sie jede Zeile einer Datei
- 28. So sperren Sie eine einzelne Zeile
- 29. So aktualisieren Sie bestimmte Zeile in MYSQL
- 30. Validierung auf einer Zeile-für-Zeile Basis
Hat der cython Debugger erlauben Sie es zu anhalten? Dann können Sie [* this *] (http://stackoverflow.com/a/378024/23771) tun. –