cprofileを使用してPythonでクラスの方法をプロファイリングしますか?
質問
cprofileを使用して、Pythonで関数の方法をプロファイルしたいと思います。以下を試しました:
import cProfile as profile
# Inside the class method...
profile.run("self.myMethod()", "output_file")
しかし、それは機能しません。 「実行」でself.methodを呼び出すにはどうすればよいですか?
解決
ProfileHooksデコレーターを使用します
他のヒント
編集:申し訳ありませんが、プロファイルコールがあったことに気付いていませんでした の クラスメソッド。
run
ただ試みます exec
あなたがそれを渡す文字列。もしも self
使用しているプロファイラーの範囲内で何にも縛られていません、あなたはそれをで使用することはできません run
!使用 runctx
プロファイラーへの呼び出しの範囲内でローカル変数とグローバル変数を渡す方法:
>>> import time
>>> import cProfile as profile
>>> class Foo(object):
... def bar(self):
... profile.runctx('self.baz()', globals(), locals())
...
... def baz(self):
... time.sleep(1)
... print 'slept'
... time.sleep(2)
...
>>> foo = Foo()
>>> foo.bar()
slept
5 function calls in 2.999 CPU seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 2.999 2.999 <stdin>:5(baz)
1 0.000 0.000 2.999 2.999 <string>:1(<module>)
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
2 2.999 1.499 2.999 1.499 {time.sleep}
最後の行に注意してください: time.sleep
時間を費やしているものです。
私は単一のルーチンをプロファイリングすることをお勧めしません。それは、そこに問題があることを事前に知ることを意味するからです。
パフォーマンスの問題の基本的な側面は、それらが卑劣だということです。彼らはあなたがそうであると思う場所ではありません。もし彼らがそうだったら、あなたはすでに彼らを解決していたからです。
現実的なワークロードでプログラム全体を実行し、プロファイリング手法で問題がどこにあるかを伝えることをお勧めします。
これが例です プロファイリングが問題を見つける場所で、それは予想される場所ではありません。
プロファイルの下での関数が値を返す場合、@katrielalexから優れた答えをわずかに変更する必要があります。
... profile.runctx('val = self.baz()', globals(), locals())
... print locals()['val']
所属していません StackOverflow