2014-01-10 7 views
23

MacOSX Xcode Instruments eignet sich hervorragend zum Profilieren von nativem Code. Allerdings habe ich auch einen großen Teil der Python-Anrufe in meinen Callstacks. Kann ich irgendwie Instrumente Python-bewusst machen?MacOSX-Instrumente zum Profilieren Python-Code

Eine Lösung, die ich mir vorstellen könnte, ist, wenn sie einen PyEval_EvalFrameEx Frame sieht, der in ihren lokalen Variablen/Parametern nach verschiedenen Python-Aufrufen sucht und mir einige Call-Informationen anzeigt.

Ich frage nicht nur über einen Python-Profiler. Ich möchte meinen nativen Code profilieren. Aber in diesem nativen Code-Profiling möchte ich einige weitere Informationen hinzufügen, um die Python-Stack-Frames zu analysieren und zu übersetzen.

+2

haben Sie versucht [RunSnakeRun] (http://www.vrplumber.com/programming/runsnakerun/)? Ich persönlich habe es nie benutzt, aber es scheint das zu sein, wonach du suchst. – KronoS

+0

@KronoS: Ich denke, ich habe ähnliche Lösungen für cProfile und Exporteure zu KCacheGrind gesehen. Jedoch: (1) Ich möchte auch das native C-Code-Profil sehen, d. H. Beide kombiniert. (2) Ich möchte auch gerne. Verwenden Sie Xcode-Instrumente. – Albert

+1

Vielleicht verstehe ich nicht ganz, was Sie fragen, aber vielleicht könnten Sie Ihr Skript mit 'python -m cProfile meinskript.py' ausführen? Dann könnten Sie einfach die Ausgabe in eine Logdatei speichern – ollien

Antwort

-1

Es gibt kein MacOSX-Instrument zum Profilieren von Python-Code. Persönlich verwende ich cProfile. Es ist ein interner Profiler namens cProfile. Sie können es in eine der beiden folgenden Arten verwenden:

import cProfile 
cProfile.run('print "Hello World!"') 

oder

python -m cProfile your_own_script.py 

Das Ergebnis so etwas wie wäre:

>>> cProfile.run('print "Hello World!"') 
Hello World! 
     2 function calls in 0.000 seconds 

    Ordered by: standard name 

    ncalls tottime percall cumtime percall filename:lineno(function) 
     1 0.000 0.000 0.000 0.000 <string>:1(<module>) 
     1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects} 

Edit: Wenn Sie native Menge Anrufe suchen . Dann sollten Sie zu strace (für Linux) und dtruss (für Mac OSX) oder ein anderes Tool wie das verschieben. Im Grunde können Sie Ihr Python-Skript in einen strace-Aufruf umbrechen und Sie können alle Ihre "nativen" C/C++ - Aufrufe anzeigen. Für andere Linux-Systeme verwenden:

strace -fetrace=open python your_script.py 

oder wenn Sie auf Mac OSX:

dtruss -f -t open python your_script.py 

Ich hoffe, das hilft!

+0

Das ist nicht die Frage. Die Frage bezieht sich auf nativen Code. – Albert

+0

Wenn Sie nach Native-Level-Anrufen suchen. Dann sollten Sie sich auf "strace" oder ein anderes Werkzeug bewegen. Im Grunde können Sie Ihr Python-Skript in einen "strace" -Aufruf einbinden und Sie werden in der Lage sein, all Ihre "nativen" C/C++ - Aufrufe anzuzeigen. – tricklepie

+0

Also, wie würde ich die Python-Aufrufe dann in 'strace' sehen? Ich möchte nicht nur 'PyEval_EvalFrameEx' oder so sehen, ich möchte die echte Python-Funktion sehen. (Ich habe auch nicht nach "strace" gefragt, sondern nach MacOSX Instruments, aber das ist weniger wichtig.) – Albert

0

Es gibt einen tollen neuen GUI Profiler namens PyVmMonitor. Ich habe nicht erfolgreich wurde es noch meine laufenden App zu befestigen, aber ich habe es mit Profilen aus der Befehlszeile wie folgt zu generieren und zu analysieren:

python /Applications/PyVmMonitor.app/Contents/MacOS/public_api/pyvmmonitor --profile=yappi my_app.py 
1

Nach dieser stackoverflow answer ist Instruments eine GUI Front-End zu dtrace. Es gibt Apple Documentation, die diese und einige OS-X spezifische Artikel auf dtrace unter unter anderem bestätigen.

Es gibt patches, die auf die CPython-Quelle angewendet werden können, bevor sie kompiliert wird, um sie für dtrace zu instrumentieren. Es scheint, dass es Unterstützung für das automatische Erstellen eines neuen Python mit dtrace in homebrew gibt oder gab, aber googeln jetzt, ich finde keine Referenzen für ein Homebrew-Rezept mit Dtrace-Provider-Unterstützung für aktuelle Python-Releases (2.7.10, 3.4/3.5). Ich habe es nicht versucht, vielleicht funktioniert das aktuelle Rezept nur mit einem --with-dtrace Schalter beim Aufbau.

Es gibt eine Rede von PyTexas 2013: dtrace, Python and You, die davon spricht, eine Python-Installation mit dtrace-Unterstützung (speziell mit einem Mac demonstriert) und der Verwendung von dtrace in der Befehlszeile zu erhalten.

Ich würde denken, sobald Sie ein Python mit Dtrace-Unterstützung installiert hatten, sollten Sie in der Lage sein, es in Instruments zu sehen und zu verwenden. Wenn Sie einer OS X-Anwendung einen Python-Interpreter hinzufügen (entweder als.Framework oder eine andere Form der Verknüpfung), wenn diese Python die Dtrace-Patches vor der Kompilierung angewendet hätte, würde ich auch denken, dass es für die Arbeit mit Dtrace verfügbar wäre. Ich habe es nicht versucht, aber angesichts dessen, was ich über Dtrace weiß, glaube ich, dass es funktionieren sollte. Wenn ich bestätige, dass dies der Fall ist, werde ich zurückschreiben.

Verwandte Themen