자세한 내용은 https://vmprof.readthedocs.org를 방문하세요!
pip install vmprof
python -m vmprof <your program> <your program args>
우리의 빌드 시스템은 PyPI(Linux, Mac OS X)에 휠을 제공합니다. 소스에서 빌드하는 경우 CPython 개발 헤더와 libunwind 헤더(Linux에만 해당)를 설치해야 합니다. Windows에서는 Python 버전에 Microsoft Visual C++ 컴파일러가 필요하다는 의미입니다.
개발 설정은 다음 명령을 사용하여 수행할 수 있습니다.
$ 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
사용하는 방법의 예입니다.
CPU 주기를 소모하는 작은 프로그램을 실행합니다(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는 함수 내부의 개별 라인에 대한 통계를 수집하고 표시할 수 있는 라인 프로파일링 모드를 지원합니다.
라인 통계 수집을 활성화하려면 vmprof에 --lines
인수를 추가하세요.
$ python -m vmprof --lines -o < output-file > < your program > < your program args >
또는 코드에서 vmprof를 호출할 때 vmprof.enable
함수에 lines=True
인수를 전달합니다.
모든 기능에 대한 라인 통계를 보려면 vmprofshow
의 lines
모드를 사용하십시오.
$ 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
이 보기는 중첩을 제외하면 "트리" 보기와 매우 유사합니다.