GitHubじゃ!Pythonじゃ!

GitHubからPython関係の優良リポジトリを探したかったのじゃー、でも英語は出来ないから日本語で読むのじゃー、英語社会世知辛いのじゃー

what-studio

profiling – インタラクティブな連続Pythonプロファイラ

投稿日:

インタラクティブな連続Pythonプロファイラ。

プロファイリング

プロファイリングパッケージは、インタラクティブな連続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
    1. コードロケーションを持つ関数名。 (例: my_func (my_code.py:42)my_func (my_module:42)
    2. 行番号のない場所のみ。 (例: my_code.pymy_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

ありがとう

ライセンス

Heungsubリーによって何が書かれた StudioNexonにあり、 BSD 3-Clauseライセンスで配布されています。







-what-studio
-, , , ,

執筆者: