关于python:在KCacheGrind中使用cProfile结果

Using cProfile results with KCacheGrind

我正在使用cprofile分析我的python程序。基于这次谈话,我觉得kcachegrind可以解析和显示cprofile的输出。

但是,当我进入导入文件时,kcachegrind在状态栏中显示一个"未知文件格式"错误,并且坐在那里什么也不显示。

在我的分析数据与kcachegrind兼容之前,我是否需要做一些特殊的事情?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
...
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.62


使用cprofile,您还可以对现有程序进行概要分析,而无需编写任何单独的概要分析脚本。只需使用探查器运行程序

1
python -m cProfile -o profile_data.pyprof script_to_profile.py

用pyprof2calltree打开kcachegrind中的剖面数据,其-k开关自动打开kcachegrind中的数据。

1
pyprof2calltree -i profile_data.pyprof -k

例如,对整个贴纸服务器和webapp进行这样的分析

1
python -m cProfile -o pyprof.out `which paster` serve development.ini

pyprof2calltree可以通过易于安装来安装。


您可以使用profilestats.profiledecorator($ pip install profilestats--pyprof2calltree模块的简单包装(lsprofcalltree.py的重新包装):

1
2
3
4
5
from profilestats import profile

@profile
def func():
    # do something here

脚本可以像往常一样运行。profilestats创建了两个文件:cachegrind.out.profilestatsprofilestats.prof的kcachegrind兼容格式和cprofile格式。


可以使用名为lscallprofttree的外部模块来完成。

这篇文章解释了:Cherrypy-CacheGrind

我得到的代码是这样的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
...
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一起提供)模块的方法,我还是会非常感兴趣的。


如果您真正要做的是查看代码的哪些部分可以优化速度,并且您可以在调试器中随机暂停它,那么这个方法可以工作。这可能令人惊讶,但你不需要太多的堆垛。


在kcachegrind/qcachegrind中有3种不同的方法来分析代码和可视化结果:

I型剖面图

1-从IPython配置myfunc()。

1
2
3
import cProfile
filename = 'filename.prof'
cProfile.run('myfunc()', filename)

2-将您的文件转换为外壳中可用的kcachegrind文件

1
2
sudo pip install pyprof2calltree
pyprof2calltree -i filename.prof -o callgrind.filename.prof

3-在kcachegrind中打开callgrind.filename.prof

II-嵌入式CProfile

1-概述代码中的几行。

1
2
3
4
5
6
7
import cProfile
filename = 'filename.prof'
pr = cProfile.Profile()
pr.enable()
# ... lines to profile ...
pr.disable()
pr.dump_stats(filename)

2-将您的文件转换为外壳中可用的kcachegrind文件

1
2
sudo pip install pyprof2calltree
pyprof2calltree -i filename.prof -o callgrind.filename.prof

3-在kcachegrind中打开callgrind.filename.prof

雅皮布

1-从IPython或代码中配置myfunc()。

1
2
3
4
5
6
7
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