web-dev-qa-db-ja.com

Pythonでマルチスレッドプログラムをプロファイリングするにはどうすればよいですか?

私はPythonで本質的にマルチスレッド化されたモジュールを開発していて、それがどこで時間を費やしているかを知りたいのです。 cProfileはメインスレッドのみをプロファイルするようです。計算に関係するすべてのスレッドをプロファイリングする方法はありますか?

58
rog

yappi (Yet Another Python Profiler))を参照してください。

37
sumercip

1つのcProfileを実行する代わりに、各スレッドで個別のcProfileインスタンスを実行してから、統計を組み合わせることができます。 Stats.add()がこれを自動的に行います。

18
vartec

少し余分な作業を行うことに問題がなければ、profile(self, frame, event, arg)を実装する独自のプロファイリングクラスを作成できます。これは関数が呼び出されるたびに呼び出され、そこから統計を収集する構造をかなり簡単に設定できます。

次に _threading.setprofile_ を使用して、その関数をすべてのスレッドに登録できます。関数が呼び出されたら、threading.currentThread()を使用して、どの関数で実行されているかを確認できます。詳細(およびすぐに実行できるレシピ)はこちら:

http://code.activestate.com/recipes/465831/

http://docs.python.org/library/threading.html#threading.setprofile

7
DNS

異なるスレッドのメイン関数が異なる場合、 ここ から非常に役立つprofile_func()デコレーターを使用できます。

2
Walter