web-dev-qa-db-ja.com

KCacheGrindでのcProfile結果の使用

私は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)
...

パッケージバージョン

  • KCacheGrind 4.3.1
  • Python 2.6.2
53

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に同梱されていない)モジュールを必要としない、これを行う方法を誰かが知っている場合でも、私はそれについて非常に興味があります。

7

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でインストールできます。

89
Mikael Lepistö

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形式で対応します。

17
jfs

実際にやろうとしているのは、コードのどの部分が速度を最適化できるかを確認することであり、デバッガーでランダムに一時停止できる場合は このメソッドは機能します 。驚くかもしれませんが、それほど多くのスタックショットは必要ありません。

6
Mike Dunlavey

コードをプロファイルし、KCachegrind/Qcachegrindで結果を視覚化する3つの方法:

I-プロファイル

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を開きます

II-組み込みプロファイル

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を開きます

III-やっぴ

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を開きます

5
Axel Borja