私はcProfileを使用して私のPythonプログラムをプロファイリングしています。 この講演)に基づいて KCacheGrindがcProfileからの出力を解析および表示できるという印象を受けました。
しかし、ファイルをインポートしようとすると、KCacheGrindはステータスバーに「不明なファイル形式」エラーを表示し、そこに何も表示しません。
プロファイリング統計がKCacheGrindと互換性を持つ前に何か特別なことはありますか?
...
if profile:
import cProfile
profileFileName = 'Profiles/pythonray_' + time.strftime('%Y%m%d_%H%M%S') + '.profile'
profile = cProfile.Profile()
profile.run('pilImage = camera.render(scene, samplePattern)')
profile.dump_stats(profileFileName)
profile.print_stats()
else:
pilImage = camera.render(scene, samplePattern)
...
パッケージバージョン
lscallproftree という外部モジュールを使用して実行できます。
この記事では、その方法について説明します。 CherryPy-CacheGrind
結果のコードは次のようになります。
...
if profile:
import cProfile
import lsprofcalltree
profileFileName = 'Profiles/pythonray_' + time.strftime('%Y%m%d_%H%M%S') + '.profile'
profile = cProfile.Profile()
profile.run('pilImage = camera.render(scene, samplePattern)')
kProfile = lsprofcalltree.KCacheGrind(profile)
kFile = open (profileFileName, 'w+')
kProfile.output(kFile)
kFile.close()
profile.print_stats()
else:
pilImage = camera.render(scene, samplePattern)
...
外部(つまり、Pythonに同梱されていない)モジュールを必要としない、これを行う方法を誰かが知っている場合でも、私はそれについて非常に興味があります。
CProfileを使用すると、個別のプロファイリングスクリプトを作成せずに、既存のプログラムをプロファイリングすることもできます。プロファイラーでプログラムを実行するだけ
python -m cProfile -o profile_data.pyprof script_to_profile.py
pyprof2calltreeを使用してkcachegrindでプロファイルデータを開きます。その-kスイッチはkcachegrindでデータを自動的に開きます
pyprof2calltree -i profile_data.pyprof -k
たとえば、pasteサーバー全体とwebappのプロファイリングは次のようになります。
python -m cProfile -o pyprof.out `which paster` serve development.ini
pyprof2calltreeはeasy_installでインストールできます。
profilestats.profile
デコレータ($ pip install profilestats
)- pyprof2calltree モジュールの単純なラッパー(lsprofcalltree.py
):
from profilestats import profile
@profile
def func():
# do something here
スクリプトは通常どおり実行できます。 profilestats
は2つのファイルを作成します:cachegrind.out.profilestats
およびprofilestats.prof
KCachegrind互換およびcProfile形式で対応します。
実際にやろうとしているのは、コードのどの部分が速度を最適化できるかを確認することであり、デバッガーでランダムに一時停止できる場合は このメソッドは機能します 。驚くかもしれませんが、それほど多くのスタックショットは必要ありません。
コードをプロファイルし、KCachegrind/Qcachegrindで結果を視覚化する3つの方法:
1-ipythonからのmyfunc()のプロファイル
import cProfile
filename = 'filename.prof'
cProfile.run('myfunc()', filename)
2-ファイルをシェルで使用可能なkcachegrindファイルに変換します
Sudo pip install pyprof2calltree
pyprof2calltree -i filename.prof -o callgrind.filename.prof
3-kcachegrindでcallgrind.filename.profを開きます
1-コードの数行をプロファイリングします。
import cProfile
filename = 'filename.prof'
pr = cProfile.Profile()
pr.enable()
# ... lines to profile ...
pr.disable()
pr.dump_stats(filename)
2-ファイルをシェルで使用可能なkcachegrindファイルに変換します
Sudo pip install pyprof2calltree
pyprof2calltree -i filename.prof -o callgrind.filename.prof
3-kcachegrindでcallgrind.filename.profを開きます
1-ipythonまたはコードからmyfunc()をプロファイルする
import yappi
filename = 'callgrind.filename.prof'
yappi.set_clock_type('cpu')
yappi.start(builtins=True)
myfunc()
stats = yappi.get_func_stats()
stats.save(filename, type='callgrind')
2-kcachegrindでcallgrind.filename.profを開きます