そこそこの規模のライブラリ書いてると、プロファイルするとき毎回コマンドラインからスクリプトを実行したりunittestのsetUpとtearDown書くのが面倒だったりするので、デコレータを作っておきます。
d_profile.py
import cProfile
import pstats
def profile(func):
def _f(*args, **kwargs):
pr = cProfile.Profile()
pr.enable()
print("\n<<<---")
res = func(*args, **kwargs)
p = pstats.Stats(pr)
p.strip_dirs().sort_stats('cumtime').print_stats(20)
print("\n--->>>")
return res
return _f
特定の関数やメソッドだけピンポイントでプロファイルできます。プロファイルを無効にしたいときはデコレータをコメントアウトします。もちろんunittestで特定のテストメソッドだけプロファイルしたい場合にも使えます。
func.py
from d_profile import profile
@profile
def hoge(a, b):
return a * b