在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.profilestatsprofilestats.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