過去に、すべての関数を同じファイルに含むPythonコードを記述しましたが、次のコードを使用してプログラムのプロファイルを作成できました。
これは私が書いたデコレータです:
def do_profile(cond):
def resdec(f):
if not cond:
return f
return profile(f)
return resdec
そして、これは私がそれを使用する方法です:
@do_profile(DO_PROFILE)
def my_func():
return 1
kernprof.py
次に、スクリプトを呼び出します。
kernprof.py -l my_program.py
その間に、私はOOPに慣れ、プログラムを多くのクラスに書き直し、プログラムは次のように開始されました。
if __name__ == "__main__":
my_app = myApp()
my_app.run()
myApp
は、他のクラスとも頻繁に通信しているクラスです。
class myApp():
@do_profile(DO_PROFILE)
def foo_method(self, arg1):
pass
各メソッドdo_profile
の前にデコレータを追加しましたが、実行すると、結果のファイルは空になりますmyApp
kernprof.py
.prof
では、クラスのメソッドをプロファイリングする最も簡単な方法は何ですか?デコレータとフラグを使ってこれをオン/オフに切り替えたいと思います。
編集1:私はここで可能な最も簡単な解決策に本当に興味があります。デコレータはエレガントなソリューションであることがわかりますが、もっと簡単にできるかもしれません。私がやりたくないのは、cProfile's
プロファイルのようなものを使用することですprofile.runctx('self.baz()', globals(), locals())
。多くのクラスやメソッドを処理する場合、これは実用的な解決策ではありません。