在KCacheGrind中使用cProfile结果
我使用cProfile来分析我的Python程序。 根据这个演讲,我觉得KCacheGrind可以parsing和显示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
通过cProfile,您还可以configuration现有的程序,而不需要制作任何单独的分析脚本。 只需运行程序与分析器
python -m cProfile -o profile_data.pyprof script_to_profile.py
并使用pyprof2calltree在kcachegrind中打开configuration文件数据,其中的-k选项会自动打开kcachegrind中的数据
pyprof2calltree -i profile_data.pyprof -k
例如分析整个贴图服务器和webapp将会这样完成
python -m cProfile -o pyprof.out `which paster` serve development.ini
pyprof2calltree可以使用easy_install进行安装。
你可以使用profilestats.profile
装饰器( $ pip install profilestats
) – pyprof2calltree模块的一个简单包装( lsprofcalltree.py的重新lsprofcalltree.py
):
from profilestats import profile @profile def func(): # do something here
脚本可以照常运行。 profilestats
会相应地创build两个文件: cachegrind.out.profilestats
和profilestats.prof
,其格式为KCachegrind兼容和cProfile格式。
可以使用称为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)模块,我仍然很有兴趣听到它。
如果你真正要做的是看你的代码的哪些部分可以优化速度,你可以在debugging器中随机暂停它, 这种方法是有效的 。 这可能是令人惊讶的,但你并不需要很多stackshots。
3种不同的方法来分析您的代码并在KCachegrind / Qcachegrind中可视化结果:
我 – CPROFILE
1 – 从ipython中分析myfunc()
import cProfile filename = 'filename.prof' cProfile.run('myfunc()', filename)
2 – 将文件转换为shell中可用的kcachegrind文件
sudo pip install pyprof2calltree pyprof2calltree -i filename.prof -o callgrind.filename.prof
3 – 在kcachegrind中打开callgrind.filename.prof
II – embedded式CPROFILE
1 – 在您的代码中简介几行。
import cProfile filename = 'filename.prof' pr = cProfile.Profile() pr.enable() # ... lines to profile ... pr.disable() pr.dump_stats(filename)
2 – 将文件转换为shell中可用的kcachegrind文件
sudo pip install pyprof2calltree pyprof2calltree -i filename.prof -o callgrind.filename.prof
3 – 在kcachegrind中打开callgrind.filename.prof
三 – YAPPI
1 – 从ipython或从您的代码configuration文件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