Weitere Informationen finden Sie unter https://vmprof.readthedocs.org!
pip install vmprof
python -m vmprof <your program> <your program args>
Unser Build-System liefert Räder an PyPI (Linux, Mac OS X). Wenn Sie aus dem Quellcode erstellen, müssen Sie CPython-Entwicklungsheader und Libunwind-Header installieren (nur unter Linux). Unter Windows bedeutet das, dass Sie den Microsoft Visual C++ Compiler für Ihre Python-Version benötigen.
Das Einrichten der Entwicklung kann mit den folgenden Befehlen erfolgen:
$ virtualenv -p /usr/bin/python3 vmprof3
$ source vmprof3/bin/activate
$ python setup.py develop
Sie müssen Python-Entwicklungspakete installieren. Im Falle von Debian oder Ubuntu benötigen Sie beispielsweise die Pakete python3-dev
und libunwind-dev
. Jetzt ist es an der Zeit, einen Test zu schreiben und Ihre Funktion zu implementieren. Wenn Sie möchten, dass sich Ihre Änderungen auf vmprof.com auswirken, gehen Sie zu https://github.com/vmprof/vmprof-server und befolgen Sie die Einrichtungsanweisungen.
Weitere Informationen finden Sie in unserem Abschnitt zur Entwicklung unter https://vmprof.readthedocs.org.
vmprofshow
ist ein Befehlszeilentool, das mit VMProf geliefert wird. Es kann Profildateien lesen und eine formatierte Ausgabe erzeugen.
Hier ist ein Beispiel für die Verwendung vmprofshow
:
Führen Sie dieses kleinere Programm aus, das CPU-Zyklen verbrennt (mit aktiviertem vmprof):
$ pypy vmprof/test/cpuburn.py # you can find cpuburn.py in the vmprof-python repo
Dadurch wird eine Profildatei vmprof_cpuburn.dat
erstellt. Zeigen Sie nun das Profil mit vmprofshow
an. vmprofshow
verfügt über mehrere Modi zum Anzeigen von Daten. Wir beginnen mit dem baumbasierten Modus.
$ vmprofshow vmprof_cpuburn.dat tree
Sie sehen eine (farbige) Ausgabe:
$ vmprofshow vmprof_cpuburn.dat tree
100.0% <module> 100.0% tests/cpuburn.py:1
100.0% .. test 100.0% tests/cpuburn.py:35
100.0% .... burn 100.0% tests/cpuburn.py:26
99.2% ...... _iterate 99.2% tests/cpuburn.py:19
97.7% ........ _iterate 98.5% tests/cpuburn.py:19
22.9% .......... _next_rand 23.5% tests/cpuburn.py:14
22.9% ............ JIT code 100.0% 0x7fa7dba57a10
74.7% .......... JIT code 76.4% 0x7fa7dba57a10
0.1% .......... JIT code 0.1% 0x7fa7dba583b0
0.5% ........ _next_rand 0.5% tests/cpuburn.py:14
0.0% ........ JIT code 0.0% 0x7fa7dba583b0
Es gibt auch eine Option --html
um dieselben Informationen wie HTML auszugeben und in einem Browser anzuzeigen. In diesem Fall können die Äste interaktiv erweitert und reduziert werden.
vmprof unterstützt den Zeilenprofilierungsmodus, der das Sammeln und Anzeigen der Statistiken für separate Zeilen innerhalb von Funktionen ermöglicht.
Um die Erfassung von Zeilenstatistiken zu aktivieren, fügen Sie das Argument --lines
zu vmprof hinzu:
$ python -m vmprof --lines -o < output-file > < your program > < your program args >
Oder übergeben Sie das Argument lines=True
an die Funktion vmprof.enable
, wenn Sie vmprof aus dem Code aufrufen.
Um Zeilenstatistiken für alle Funktionen anzuzeigen, verwenden Sie den lines
von vmprofshow
:
$ vmprofshow < output-file > lines
Um Zeilenstatistiken für eine bestimmte Funktion anzuzeigen, verwenden Sie das Argument --filter
mit dem Funktionsnamen:
$ vmprofshow < output-file > lines --filter < function-name >
Sie werden das Ergebnis sehen:
$ vmprofshow vmprof_cpuburn.dat lines --filter _next_rand
Total hits: 1170 s
File: tests/cpuburn.py
Function: _next_rand at line 14
Line # Hits % Hits Line Contents
=======================================
14 38 3.2 def _next_rand(self):
15 # http://rosettacode.org/wiki/Linear_congruential_generator
16 835 71.4 self._rand = (1103515245 * self._rand + 12345) & 0x7fffffff
17 297 25.4 return self._rand
vmprofshow
verfügt auch über einen flat
-Modus.
Während die baumbasierten und zeilenbasierten Ausgabestile für vmprofshow
einen guten Überblick darüber geben, wo die Zeit verbracht wird, wenn man sie von der „Wurzel“ des Aufrufdiagramms aus betrachtet, ist es manchmal wünschenswert, stattdessen eine Ansicht von den „Blättern“ aus zu erhalten. Dies ist besonders hilfreich, wenn Funktionen vorhanden sind, die von mehreren Stellen aufgerufen werden, wobei jeder Aufruf nicht viel Zeit in Anspruch nimmt, alle Aufrufe zusammengenommen jedoch erhebliche Kosten verursachen.
$ vmprofshow vmprof_cpuburn.dat flat andreask_work@dunkel 15:24
28.895% - _PyFunction_Vectorcall:/home/conda/feedstock_root/build_artifacts/python-split_1608956461873/work/Objects/call.c:389
18.076% - _iterate:cpuburn.py:20
17.298% - _next_rand:cpuburn.py:15
5.863% - <native symbol 0x563a5f4eea51>:/home/conda/feedstock_root/build_artifacts/python-split_1608956461873/work/Objects/longobject.c:3707
5.831% - PyObject_SetAttr:/home/conda/feedstock_root/build_artifacts/python-split_1608956461873/work/Objects/object.c:1031
4.924% - <native symbol 0x563a5f43fc01>:/home/conda/feedstock_root/build_artifacts/python-split_1608956461873/work/Objects/abstract.c:787
4.762% - PyObject_GetAttr:/home/conda/feedstock_root/build_artifacts/python-split_1608956461873/work/Objects/object.c:931
4.373% - <native symbol 0x563a5f457eb1>:/home/conda/feedstock_root/build_artifacts/python-split_1608956461873/work/Objects/abstract.c:1071
3.758% - PyNumber_Add:/home/conda/feedstock_root/build_artifacts/python-split_1608956461873/work/Objects/abstract.c:957
3.110% - <native symbol 0x563a5f47c291>:/home/conda/feedstock_root/build_artifacts/python-split_1608956461873/work/Objects/longobject.c:4848
1.587% - PyNumber_Multiply:/home/conda/feedstock_root/build_artifacts/python-split_1608956461873/work/Objects/abstract.c:988
1.166% - _PyObject_GetMethod:/home/conda/feedstock_root/build_artifacts/python-split_1608956461873/work/Objects/object.c:1139
0.356% - <native symbol 0x563a5f4ed8f1>:/home/conda/feedstock_root/build_artifacts/python-split_1608956461873/work/Objects/longobject.c:3432
0.000% - <native symbol 0x7f0dce8cca80>:-:0
0.000% - test:cpuburn.py:36
0.000% - burn:cpuburn.py:27
Manchmal kann es wünschenswert sein, „native“ Funktionen auszuschließen:
$ vmprofshow vmprof_cpuburn.dat flat --no-native andreask_work@dunkel 15:27
53.191% - _next_rand:cpuburn.py:15
46.809% - _iterate:cpuburn.py:20
0.000% - test:cpuburn.py:36
0.000% - burn:cpuburn.py:27
Beachten Sie, dass die Ausgabe die in jeder Funktion verbrachte Zeit darstellt, mit Ausnahme der aufgerufenen Funktionen. (Im Modus --no-native
bleiben die Aufrufe des nativen Codes in der Gesamtzahl enthalten.)
Manchmal kann es auch wünschenswert sein, Timings inklusive aufgerufener Funktionen zu erhalten:
$ vmprofshow vmprof_cpuburn.dat flat --include-callees andreask_work@dunkel 15:31
100.000% - <native symbol 0x7f0dce8cca80>:-:0
100.000% - test:cpuburn.py:36
100.000% - burn:cpuburn.py:27
100.000% - _iterate:cpuburn.py:20
53.191% - _next_rand:cpuburn.py:15
28.895% - _PyFunction_Vectorcall:/home/conda/feedstock_root/build_artifacts/python-split_1608956461873/work/Objects/call.c:389
7.807% - PyNumber_Multiply:/home/conda/feedstock_root/build_artifacts/python-split_1608956461873/work/Objects/abstract.c:988
7.483% - <native symbol 0x563a5f457eb1>:/home/conda/feedstock_root/build_artifacts/python-split_1608956461873/work/Objects/abstract.c:1071
6.220% - <native symbol 0x563a5f4eea51>:/home/conda/feedstock_root/build_artifacts/python-split_1608956461873/work/Objects/longobject.c:3707
5.831% - PyObject_SetAttr:/home/conda/feedstock_root/build_artifacts/python-split_1608956461873/work/Objects/object.c:1031
4.924% - <native symbol 0x563a5f43fc01>:/home/conda/feedstock_root/build_artifacts/python-split_1608956461873/work/Objects/abstract.c:787
4.762% - PyObject_GetAttr:/home/conda/feedstock_root/build_artifacts/python-split_1608956461873/work/Objects/object.c:931
3.758% - PyNumber_Add:/home/conda/feedstock_root/build_artifacts/python-split_1608956461873/work/Objects/abstract.c:957
3.110% - <native symbol 0x563a5f47c291>:/home/conda/feedstock_root/build_artifacts/python-split_1608956461873/work/Objects/longobject.c:4848
1.166% - _PyObject_GetMethod:/home/conda/feedstock_root/build_artifacts/python-split_1608956461873/work/Objects/object.c:1139
0.356% - <native symbol 0x563a5f4ed8f1>:/home/conda/feedstock_root/build_artifacts/python-split_1608956461873/work/Objects/longobject.c:3432
Diese Ansicht ist der „Baum“-Ansicht ziemlich ähnlich, abgesehen von der Verschachtelung.