cprofileを使用してPythonでクラスの方法をプロファイリングしますか?

StackOverflow https://stackoverflow.com/questions/4492535

  •  12-10-2019
  •  | 
  •  

質問

cprofileを使用して、Pythonで関数の方法をプロファイルしたいと思います。以下を試しました:

import cProfile as profile

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

しかし、それは機能しません。 「実行」でself.methodを呼び出すにはどうすればよいですか?

役に立ちましたか?

解決

ProfileHooksデコレーターを使用します

http://pypi.python.org/pypi/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']
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top