Посетите https://vmprof.readthedocs.org для получения дополнительной информации!
pip install vmprof
python -m vmprof <your program> <your program args>
Наша система сборки поддерживает PyPI (Linux, Mac OS X). Если вы выполняете сборку из исходного кода, вам необходимо установить заголовки разработки CPython и заголовки libunwind (только в Linux). В Windows это означает, что вам понадобится компилятор Microsoft Visual C++ для вашей версии Python.
Настроить разработку можно с помощью следующих команд:
$ virtualenv -p /usr/bin/python3 vmprof3
$ source vmprof3/bin/activate
$ python setup.py develop
Вам необходимо установить пакеты разработки Python. Например, в случае Debian или Ubuntu вам понадобятся пакеты python3-dev
и libunwind-dev
. Теперь пришло время написать тест и реализовать вашу функцию. Если вы хотите, чтобы ваши изменения повлияли на vmprof.com, перейдите на https://github.com/vmprof/vmprof-server и следуйте инструкциям по настройке.
Для получения дополнительной информации обратитесь к нашему разделу по разработке на https://vmprof.readthedocs.org.
vmprofshow
— это инструмент командной строки, входящий в состав VMProf . Он может читать файлы профилей и выдавать форматированный вывод.
Вот пример использования vmprofshow
:
Запустите небольшую программу, которая сжигает циклы процессора (с включенным vmprof):
$ pypy vmprof/test/cpuburn.py # you can find cpuburn.py in the vmprof-python repo
Это создаст файл профиля vmprof_cpuburn.dat
. Теперь отобразите профиль с помощью vmprofshow
. vmprofshow
имеет несколько режимов отображения данных. Начнем с древовидного режима.
$ vmprofshow vmprof_cpuburn.dat tree
Вы увидите (цветной) вывод:
$ 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
Существует также опция --html
, позволяющая передавать ту же информацию, что и HTML, для просмотра в браузере. В этом случае ветки дерева можно интерактивно разворачивать и сворачивать.
vmprof поддерживает режим профилирования строк, который позволяет собирать и показывать статистику по отдельным строкам внутри функций.
Чтобы включить сбор статистики по линиям, добавьте аргумент --lines
в vmprof:
$ python -m vmprof --lines -o < output-file > < your program > < your program args >
Или передайте lines=True
функции vmprof.enable
при вызове vmprof из кода.
Чтобы просмотреть статистику строк для всех функций, используйте режим lines
vmprofshow
:
$ vmprofshow < output-file > lines
Чтобы просмотреть статистику строк для конкретной функции, используйте аргумент --filter
с именем функции:
$ vmprofshow < output-file > lines --filter < function-name >
Вы увидите результат:
$ 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
также имеет flat
режим.
Хотя стили вывода на основе дерева и строки для vmprofshow
дают хорошее представление о том, на что тратится время, если смотреть из «корня» графа вызовов, иногда вместо этого желательно получить представление из «листьев». Это особенно полезно, когда существуют функции, которые вызываются из нескольких мест, где каждый вызов не требует много времени, но все вызовы вместе взятые требуют значительных затрат.
$ 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
Иногда может быть желательно исключить «родные» функции:
$ 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
Обратите внимание, что выходные данные представляют собой время, затраченное на каждую функцию, за исключением вызываемых функций. (В режиме --no-native
вызываемые объекты в собственном коде остаются включенными в общее количество.)
Иногда может быть желательно получить тайминги, включающие вызываемые функции:
$ 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
Это представление очень похоже на представление «дерево», за исключением вложенности.