46

cProfile を使用して、Python で関数のメソッドをプロファイリングしたいと考えています。私は次のことを試しました:

import cProfile as profile

# Inside the class method...
profile.run("self.myMethod()", "output_file")

しかし、うまくいきません。「run」でself.methodを呼び出すにはどうすればよいですか?

4

5 に答える 5

69

編集: 申し訳ありませんが、プロファイル呼び出しがクラス メソッドあることに気づきませんでした。

runexec渡した文字列を試行するだけです。使用しているプロファイラーのスコープ内で何もバインドされていない場合は、 !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が時間を取っています。

于 2010-12-20T18:20:03.450 に答える
28

profilehooks デコレーターを使用する

http://pypi.python.org/pypi/profilehooks

于 2010-12-20T18:21:18.677 に答える
1

単一のルーチンをプロファイリングすることはお勧めしません。それは、そこに問題があることを事前に知っていることを意味するからです。

パフォーマンスの問題の基本的な側面は、それらが卑劣であることです。それらはあなたが思っている場所ではありません。

現実的なワークロードでプログラム全体を実行し、プロファイリング手法で問題の場所を特定することをお勧めします。

プロファイリングが問題を見つけた例を次に示しますが、それは予期された場所ではありません。

于 2010-12-20T18:45:28.297 に答える