ドキュメント
Pyinstrument は Python プロファイラーです。プロファイラーは、コードを最適化し、コードを高速化するのに役立つツールです。速度を最大限に向上させるには、プログラムの最も遅い部分に焦点を当てる必要があります。 Pinstrument がそれを見つけるのに役立ちます。
☕️ どこから始めればよいかわかりませんか? Calmcode.io のビデオ チュートリアルをご覧ください。
pip install pyinstrument
Pyinstrument は Python 3.8 以降をサポートしています。
git チェックアウトから Pyinstrument を実行するには、ビルド ステップがあります。詳細については、「貢献」をご覧ください。
pyinstrument の使用方法を学習したり、リファレンスを確認するには、ドキュメントにアクセスしてください。
script.py
pickle
でシリアル化されたクラスが含まれるpyinstrument script.py
使用すると、シリアル化機構が__main__
がどこにあるかわからないため、エラーが発生する可能性があります。回避策については、この問題を参照してください2024 年 10 月 11 日
HTML レンダラーに多数の改善が加えられました。
タイムライン モード - インタラクティブなリニア タイムラインを表示して拡大します。
HTML モードには、事前に設定する必要がなくなり、対話型のオプションが追加されました。
HTML ページヘッダーのデザインを合理化しました。
HTML コール スタック ビューは、矢印キー ナビゲーションをサポートしています。
「ライブラリ」コードの検出方法が変更されました。以前は、ファイル パスに文字列「/lib/」が出現すると、それはライブラリ コードとみなされます (デフォルトでは折りたたまれます)。現在、pyinstrument は、プロファイル時に Python インストールのパスとアクティブな virtualenv/conda 環境をキャプチャします。そこに保存されているファイルはライブラリとみなされます。これにより、誤検知が少なくなるはずです。
profiler.start() の呼び出しで、プロファイルの読み出しに表示される target_description パラメータを渡すことができるようになりました。
新機能の詳細については、私のブログ投稿をご覧ください。
2024 年 9 月 6 日
glom
などのパッケージをインポートできない原因となるバグを修正します。これにより、locals() dict が変更されます。 (#336)UnicodeDecodeError
を引き起こすバグを修正しました (#330)2024 年 8 月 5 日
2024 年 8 月 2 日
2024 年 8 月 1 日
with
ブロックまたは関数/メソッド デコレーターを使用して簡単にプロファイリングできるようになりました。これにより、コードがプロファイリングされ、短い読み出しが端末に出力されます。 (#327)flat
引数をコンソール出力に追加して、関数のフラットなリストを表示します (#294)2024 年 1 月 26 日
show_all
オプションを Profiler.output_html に追加します2023 年 11 月 8 日
%pyinstrument
での不要な変数展開に関するバグを修正 (#278)2023 年 10 月 12 日
-c
を追加します。これにより、 python -c
のように、コマンド ラインからコードを直接プロファイリングできるようになります。 (#271)Profiler.write_html
を追加します。 (#266)2023 年 9 月 7 日
2023 年 9 月 1 日
2023 年 7 月 22 日
__tracebackhide__
によりフレームが削除されたときに出力に[X frames hidden]
が表示されるバグを修正しました (#255)None
表示する原因となるバグを修正しました (#254)2023 年 6 月 5 日
-p flat
渡すことで有効にできます。このモードは、セルフタイムで測定された最も重いフレームを表示します。これは、一部のコードベースで役立ちます。 (#240)pstats
ファイルを保存する機能を追加します。これは、stdlib の cprofile で使用されるファイル形式です。 pyinstrument プロファイルほど詳細ではありませんが、より多くのツールと互換性があります。 (#236)--show-all
オプションの詳細を修正しました。このオプションが指定された場合、pyinstrument は Python 内部フレームを削除しなくなりました。 (#239)2022 年 11 月 5 日
__traceback_hide__
ローカル変数を設定するフレームは出力から削除されるようになりました (#217)--async_mode=enabled
フラグを指定して実行した場合、Jupyter/IPython マジックは async/await をサポートするようになりました。 (#212)2022 年 8 月 21 日
--interval
(秒、デフォルトは 0.001) を追加して、pyinstrument がプログラムをサンプリングする間隔を変更します。これは、間隔を長くするとメモリのオーバーヘッドが軽減されるため、長時間実行されるプログラムに役立ちます。レンダリング オプションを任意に設定できるコマンド ライン オプション-p
--render-option
を追加します。これにより、 pyinstrument -p processor_options.filter_threshold=0
のようにコマンドラインからfilter_threshold
などのオプションを設定できるようになります。
このオプションのヘルプ出力は次のとおりです。
-p RENDER_OPTION, --render-option=RENDER_OPTION
options to pass to the renderer, in the format
'flag_name' or 'option_name=option_value'. For
example, to set the option 'time', pass '-p
time=percent_of_total'. To pass multiple options, use
the -p option multiple times. You can set processor
options using dot-syntax, like '-p
processor_options.filter_threshold=0'. option_value is
parsed as a JSON value or a string.
コンソール出力の時間を絶対時間ではなくパーセンテージで表示する機能を追加します。 ConsoleRenderer オプションtime='percent_of_total'
を使用するか、コマンド ラインで-p
pyinstrument -p time=percent_of_total
など) を使用します。
pyinstrument セッションをロードおよび保存するためのコマンド ライン オプションを追加します。 pyinstrument -r session -o session.pyisession myscript.py
のように、 -r session
を使用して pyinstrument セッションの生データを保存できます。読み込みは--load
経由で行われます (例: pyinstrument --load session.pyisession
。
コマンド ラインの出力形式は、 -o
出力ファイル拡張子から推測されます。したがって、 pyinstrument -o profile.html myscript.py
を実行する場合、 -r html
を指定する必要はありません。pyinstrument は自動的に HTML レンダラーを使用します。または、 pyinstrument -o profile.pyisession myscript.py
を実行すると、生のセッション オブジェクトが保存されます。
FastAPI と pytest の使用例をドキュメントに追加します。
async_mode=strict
使用時に NotImplementedError が発生するバグを修正しました。
Python 3.11のサポートを追加
%load_ext pyinstrument
を使用し、プロファイリングするセルで%%pyinstrument
使用するだけです。pyinstrument -r speedscope
でプロファイリングし、speedscope Web アプリにアップロードします。PYINSTRUMENT_PROFILE_DIR_RENDERER
オプションを使用して、Django ミドルウェア ファイル出力のレンダラーを構成できるようになりました。非同期サポート! Pyinstrument は、非同期タスクが await に達したときを検出し、この await の下で非同期コンテキストの外で費やされた時間を追跡するようになりました。
たとえば、スリープを実行する非同期タスクを含む単純なスクリプトを次に示します。
import asyncio
from pyinstrument import Profiler
async def main ():
p = Profiler ( async_mode = 'disabled' )
with p :
print ( 'Hello ...' )
await asyncio . sleep ( 1 )
print ( '... World!' )
p . print ()
asyncio . run ( main ())
Pyinstrument 4.0.0 より前では、次のように実行ループで費やされた時間のみが表示されていました。
_ ._ __/__ _ _ _ _ _/_ Recorded: 18:33:03 Samples: 2
/_//_/// /_ / //_// / //_'/ // Duration: 1.006 CPU time: 0.001
/ _/ v3.4.2
Program: examples/async_example_simple.py
1.006 _run_once asyncio/base_events.py:1784
└─ 1.005 select selectors.py:553
[3 frames hidden] selectors,
1.005 kqueue.control :0
pyinstrument 4.0.0 では次のようになります。
_ ._ __/__ _ _ _ _ _/_ Recorded: 18:30:43 Samples: 2
/_//_/// /_ / //_// / //_'/ // Duration: 1.007 CPU time: 0.001
/ _/ v4.0.0
Program: examples/async_example_simple.py
1.006 main async_example_simple.py:4
└─ 1.005 sleep asyncio/tasks.py:641
[2 frames hidden] asyncio
1.005 [await]
詳細については、非同期プロファイリングのドキュメントと Profiler.async_mode プロパティを確認してください。
Pyinstrument には、完全な Python API ドキュメントを含むドキュメント サイトがあります。
--show
、 --show-regex
、 --show-all
が無視される原因となるバグを修正しました。timeline
オプション (ブール値) をプロファイラー メソッドoutput_html()
およびopen_in_browser()
に追加しました。pyinstrument -m module
の問題を修正しました。Python -> C -> Python
Python -> Python
として記録されますが、 Python -> Python -> C
正しく属性付けされます。 (#103)<__array_function__ internals>
フレームを修正しました--show
および--show-regex
オプションを追加して、特定のファイルを表示するようにマークします。これは、特定のモジュール内のプロファイリングを行い、他のモジュールを非表示にするのに役立ちます。たとえば、 pyinstrument --show '*/sympy/*' script.py
です。Pyinstrument は、デフォルトで使用しているライブラリを通じてトレースを非表示にするようになりました。したがって、urllib などの外部の内部を通過する大量のフレームを表示する代わりに、コードに集中できます。
前に | 後 |
---|---|
以前の動作に戻すには、コマンド ラインで--show-all
使用します。
非表示グループの「エントリ」フレームが表示されるため、どのコールに問題があるかがわかります
グループ内の非常に遅いフレームも表示されます (ソケットでの「読み取り」呼び出しなど)
アプリケーションコードがコンソールで強調表示されます
トレースの上部に追加のメトリクス (タイムスタンプ、サンプル数、期間、CPU 時間) が表示されます。
非表示のコードは、コード ファイルのパスに一致する--hide
または--hide-regex
オプションによって制御されます。
--hide=EXPR glob-style pattern matching the file paths whose
frames to hide. Defaults to '*/lib/*'.
--hide-regex=REGEX regex matching the file paths whose frames to hide.
Useful if --hide doesn't give enough control.
タイムラインの出力はコマンド ラインからサポートされています。
-t, --timeline render as a timeline - preserve ordering and don't
condense repeated calls
現在、レンダリング オプションがいくつかあるため、 --load-prev
を使用して以前のプロファイリング セッションをロードできます。pyinstrument は最後の 10 セッションを保持します。
非表示のグループは、次のようにアプリケーション コードにコールバックすることもできます。
(内部) タイムラインを記録する場合、フレーム ツリーは完全に直線になり、非常に正確なフレーム チャートを作成できるようになりました。
(内部) HTML レンダラーは Vue.js アプリとして書き直されました。コンソールのすべての改善点は HTML 出力にも適用され、さらにインタラクティブです。
(内部) 多数の単体テストと統合テストが追加されました。
やったー!悲惨な詳細については #49 を参照してください。気に入っていただければ幸いです。
Recorders
撤去されています。フレーム記録はProfiler
オブジェクトの内部になりました。これは、「フレーム」オブジェクトがより汎用的であることを意味し、...--version
コマンドライン オプションを追加 JSON出力のサポートが追加されました。 pyinstrument --renderer=json scriptfile.py
を使用します。 PR
@iddan は、JSON 出力を使用したインタラクティブなビューアをまとめました。
pyinstrument --html
を実行し、出力をファイルにパイプしない場合、pyinstrument はコンソール出力を一時ファイルに書き込み、それをブラウザーで開きます。
-m
フラグです (例: pyinstrument -m module_name
)。 PR Pyinstrument をwith
ブロックで使用できるようになりました。
例えば:
profiler = pyinstrument.Profiler()
with profiler:
# do some work here...
print(profiler.output_text())
古いバージョンの Django のミドルウェア修正
Pyinstrument は新しいプロファイリング モードを使用します。 pyintrument はシグナルを使用するのではなく、PyEval_SetProfile に基づいて構築された新しい統計プロファイラーを使用します。これは、メイン スレッドの制限がなくなり、Pyinstrument を使用する際の IO エラーがなくなり、別の 'setprofile' モードが必要なくなることを意味します。
レンダラー。ユーザーは、 Profiler.output()
のrenderer
引数を使用するか、コマンド ラインで--renderer
引数を使用して、代替レンダラーを使用するように Pyinstrument をカスタマイズできます。
レコーダー。 Pyinstrument の他の使用例 (フレーム チャートなど) をサポートするために、pyinstrument には「タイムライン」レコーダー モードが追加されました。このモードでは、キャプチャしたフレームを直線的に記録するため、プログラムの実行をタイムライン上で確認できます。
pyinstrument
コマンド。 $ pyinstrument script.py
実行することで、シェルから Python スクリプトをプロファイリングできるようになりました。これはpython -m pyinstrument
と同等になりました。ありがとう@asmeurer!アプリケーション コードは HTML トレースで強調表示され、見つけやすくなります。
Django インターフェイスにPYINSTRUMENT_PROFILE_DIR
オプションを追加しました。これにより、すべてのリクエストのプロファイルが指定されたフォルダーのファイルに記録されます。 API 呼び出しのプロファイリングに役立ちます。
シグナル モードで問題が発生した場合に使用するために、Django インターフェイスにPYINSTRUMENT_USE_SIGNAL
オプションを追加しました。
開発環境をセットアップするには:
virtualenv --python=python3 env
. env/bin/activate
pip install --upgrade pip
pip install -r requirements-dev.txt
pre-commit install --install-hooks
サンプル出力を取得するには:
pyinstrument examples/wikipedia_article_word_count.py
テストを実行するには:
pytest
lint チェックをローカルで実行するには:
pre-commit run --all-files
isort
やblack
などのコミット前チェックの一部は、見つかった問題を自動修正します。したがって、上記のコマンドがエラーを返した場合は、もう一度実行してみてください。2 回目は成功する可能性があります:)
すべてのチェックを実行すると時間がかかる可能性があるため、たとえば、 isort
またはblack
チェックに失敗したソース コードをフォーマットするために、チェックを個別に実行することもできます。
pre-commit run --all-files isort
pre-commit run --all-files black
pyright
チェックが失敗する理由を診断するには:
pre-commit run --all-files pyright
HTML レンダラは、任意の Web ブラウザで表示できる HTML ファイル内に、JavaScript の「バンドル」を含むサンプルの JSON 表現を埋め込むことによって機能します。
HTML レンダラー スタイルを編集するには、次の手順を実行します。
cd html_renderer
npm ci
npm run serve
最上位のwindow.profileSession
オブジェクトを使用せずに起動すると、サンプル プロファイルがフェッチされるので、それを使用して作業できます。
JS アプリをコンパイルし、それを pyinstrument Python ツールにバンドルして戻すには、次のようにします。
bin/build_js_bundle.py [--force]