我正在使用cProfile来配置我的Python程序。根据{{3}},我认为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)
...
包版本
答案 0 :(得分:88)
使用cProfile,您还可以分析现有程序,而无需创建任何单独的分析脚本。只需使用分析器
运行程序python -m cProfile -o profile_data.pyprof script_to_profile.py
使用pyprof2calltree在kcachegrind中打开配置文件数据,其-k开关自动在kcachegrind中打开数据
pyprof2calltree -i profile_data.pyprof -k
例如,分析整个贴纸服务器和webapp将像这样完成
python -m cProfile -o pyprof.out `which paster` serve development.ini
pyprof2calltree可以使用easy_install安装。
答案 1 :(得分:17)
您可以使用profilestats.profile
装饰器($ pip install profilestats
) - pyprof2calltree模块的简单包装(lsprofcalltree.py
的品牌重塑):
from profilestats import profile
@profile
def func():
# do something here
脚本可以照常运行。 profilestats
相应地以KCachegrind兼容和cProfile格式创建两个文件:cachegrind.out.profilestats
和profilestats.prof
。
答案 2 :(得分:7)
可以使用名为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)模块,我仍然非常有兴趣听到它。
答案 3 :(得分:6)
如果您真正想要做的是查看代码的哪些部分可以针对速度进行优化,您可以在调试器this method works中随机暂停它。这可能是令人惊讶的,但你不需要很多叠加。
答案 4 :(得分:5)
3种不同的方式来分析您的代码并在KCachegrind / Qcachegrind中可视化结果:
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
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
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