Github: https://github.com/what-studio/profiling
プロファイリング
プロファイリングパッケージは、インタラクティブな連続Pythonプロファイラです。 これは、 Unity 3Dプロファイラからインスピレーションを受けています。 このパッケージは以下の機能を提供します:
- プロファイリング統計はフレームスタックを保持します。
- インタラクティブなTUIプロファイリング統計ビューア。
- 統計的および決定論的プロファイリングの両方を提供します。
- リモートプロファイリングのためのユーティリティー。
- スレッドまたはグリーンレット対応のCPUタイマー。
- Python 2.7,3.3,3.4、および3.5をサポートしています。
- 現在、Linuxのみをサポートしています。
インストール
PyPI経由で最新のリリースをインストールする:
$ pip install profiling
プロファイリング
1つのプログラムをprofiling
するには、 profiling
コマンドを実行するだけです:
$ profiling your-program.py
インタラクティブビューアが実行されます。
あなたのプログラムがgreenletsを使用している場合は、 greenlet
タイマーを選択してgreenlet
:
$ profiling --timer=greenlet your-program.py
--dump
オプションを指定すると、プロファイリング結果がファイルに保存されます。 view
サブコマンドを使用すると、保存された結果を参照できview
。
$ profiling --dump=your-program.prf your-program.py
$ profiling view your-program.prf
あなたのスクリプトがsys.argv
読み込んでいる場合は、 --
sys.argv
に引数を追加してください。 引数をprofiling
コマンドから分離します。
$ profiling your-program.py -- --your-flag --your-param=42
ライブプロファイリング
あなたのプログラムがWebサーバーのような長寿命である場合、プログラムの最後にプロファイリングの結果は十分役立ちません。 おそらく、連続プロファイラが必要です。 これは、 live-profile
サブコマンドによって実現できます。
$ profiling live-profile webserver.py
デモを見る:
ライブプロファイリングサーバーもあります。 サーバーは通常の時間にプログラムのプロファイルを作成しません。 しかし、クライアントがサーバーに接続すると、プロファイリングが開始され、接続されたすべてのクライアントに結果が報告されます。
remote-profile
サブコマンドで、プロファリングサーバーを開始します。
$ profiling remote-profile webserver.py --bind 127.0.0.1:8912
また、 view
サブコマンドでサーバーのクライアントを実行します。
$ profiling view 127.0.0.1:8912
統計プロファイリング
デフォルトのプロファイラであるTracingProfiler
は、ディープコールグラフ用の確定的なプロファイラを実装しています。 もちろん、それは大きなオーバーヘッドを持っています。 オーバーヘッドはプロファイリングの結果を汚染したり、アプリケーションを遅くする可能性があります。
対照的に、 SamplingProfiler
は統計プロファイラを実装します。 他の統計的プロファイラーと同様に、それはまた非常に安いオーバーヘッドしか持たない。 プロファイルするときは、– --sampling
(まもなく-S
)オプションを使用して選択できます:
$ profiling live-profile -S webserver.py
^^
時間を計ってプロファイリングする
timeit
を使用してコードのパフォーマンスをチェックしていますか?
$ python -m timeit -s 'from trueskill import *' 'rate_1vs1(Rating(), Rating())'
1000 loops, best of 3: 722 usec per loop
チェックされたコードのプロファイルを作成する場合は、単にtimeit
サブコマンドを使用しtimeit
。
$ profiling timeit -s 'from trueskill import *' 'rate_1vs1(Rating(), Rating())'
^^^^^^^^^
コードからのプロファイリング
profiling.tracing.TracingProfiler
またはprofiling.sampling.SamplingProfiler
プログラムを直接profiling.tracing.TracingProfiler
することもできます。
from profiling.tracing import TracingProfiler
# profile your program.
profiler = TracingProfiler()
profiler.start()
... # run your program.
profiler.stop()
# or using context manager.
with profiler:
... # run your program.
# view and interact with the result.
profiler.run_viewer()
ビューアキーバインディング
- q – 終了する。
- スペース – 一時停止/再開。
- \ – NESTEDとFLATの間のレイアウトを切り替えます。
- ↑と↓ – フレームをナビゲートします。
- → – フレームを展開します。
- ← – フレームを折りたたみます。
- > – ホットスポットに行きます。
- esc – デフォーカス。
- [と] – 並べ替えの列を変更します。
列
一般
-
FUNCTION
- コードロケーションを持つ関数名。 (例:
my_func (my_code.py:42)
、my_func (my_module:42)
) - 行番号のない場所のみ。 (例:
my_code.py
、my_module
)
- コードロケーションを持つ関数名。 (例:
トレースプロファイラ
-
CALLS
– 関数の総呼び出し数。 -
OWN
(Exclusive Time) –OWN
を除く関数の合計所要時間。 -
OWN
後の/CALL
– 呼び出しごとの排他時間。 -
OWN
後の%
– 総使用時間あたりの排他時間。 -
DEEP
(インクルーシブ時間) – 関数内の合計経過時間。 -
/CALL
DEEP
後の/CALL
– 呼び出しごとの包括時間。 -
DEEP
後の%
– 総使用時間あたりの包括時間。
サンプリングプロファイラ
-
OWN
(Exclusive Samples) – 関数の直接実行中に収集されるサンプルの数。 -
OWN
後の%
– 総サンプル数ごとの排他的サンプル。 -
DEEP
(インクルーシブサンプル) – 関数の実行中に収集されるサンプルの数。 -
DEEP
後の%
– 全サンプル数あたりの包括的サンプル。
テスト
テストコードを実行するための追加要件がいくつかあります。テストコードは、次のコマンドを実行してインストールできます。
$ pip install $(python test/fit_requirements.py test/requirements.txt)
それからpytest
を実行できるはずpytest
。
$ pytest -v
ありがとう
- このプロジェクトを提案した楊承文(ヤン・スンミョン)
-
-m
オプションを実装するよう促したPavel
ライセンス
Heungsubリーによって何が書かれた! StudioはNexonにあり、 BSD 3-Clauseライセンスで配布されています。