55

我正在使用 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
4

5 回答 5

95

使用 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 安装。

于 2010-08-24T22:26:25.980 回答
17

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

from profilestats import profile

@profile
def func():
    # do something here

脚本可以照常运行。profilestats创建两个文件:cachegrind.out.profilestatsprofilestats.prof以 KCachegrind 兼容和 cProfile 格式对应。

于 2010-03-28T22:01:10.103 回答
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)模块的方法来做到这一点,我仍然很想听听它。

于 2009-12-13T10:40:34.527 回答
7

在 KCachegrind/Qcachegrind 中分析代码和可视化结果的 3 种不同方法:

我 - 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 - 嵌入式 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

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

于 2016-10-03T09:49:56.320 回答
5

如果您真正想要做的是查看代码的哪些部分可以针对速度进行优化,并且您可以在调试器中随机暂停它,则此方法有效。这可能令人惊讶,但您不需要很多堆栈快照。

于 2009-12-14T22:59:28.223 回答