cProfile を使用して、Python で関数のメソッドをプロファイリングしたいと考えています。私は次のことを試しました:
import cProfile as profile
# Inside the class method...
profile.run("self.myMethod()", "output_file")
しかし、うまくいきません。「run」でself.methodを呼び出すにはどうすればよいですか?
編集: 申し訳ありませんが、プロファイル呼び出しがクラス メソッドにあることに気づきませんでした。
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
が時間を取っています。
profilehooks デコレーターを使用する
単一のルーチンをプロファイリングすることはお勧めしません。それは、そこに問題があることを事前に知っていることを意味するからです。
パフォーマンスの問題の基本的な側面は、それらが卑劣であることです。それらはあなたが思っている場所ではありません。
現実的なワークロードでプログラム全体を実行し、プロファイリング手法で問題の場所を特定することをお勧めします。
プロファイリングが問題を見つけた例を次に示しますが、それは予期された場所ではありません。