詳細については、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 を呼び出すときに、 lines=True
引数をvmprof.enable
関数に渡します。
すべての関数の回線統計を表示するには、 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
このビューは、ネストを除いて「ツリー」ビューに非常に似ています。