def count():
from math import sqrt
for x in range(10**5):
sqrt(x)
if __name__ == '__main__':
import cProfile, pstats
cProfile.run("count()", "{}.profile".format(__file__))
s = pstats.Stats("{}.profile".format(__file__))
s.strip_dirs()
s.sort_stats("time").print_stats(10)
它's worth pointing out that using the profiler only works (by default) on the main thread, and you won' t如果您使用它们,则从其他线程获取任何信息 . 这可能是一个问题,因为在profiler documentation中完全没有提及 .
23 回答
在Virtaal的source中,有一个非常有用的类和装饰器可以很容易地进行分析(甚至对于特定的方法/函数) . 然后可以在KCacheGrind中非常舒适地查看输出 .
我认为cProfile非常适合分析,而kcachegrind非常适合可视化结果 . 中间的pyprof2calltree处理文件转换 .
要安装所需的工具(至少在Ubuntu上):
结果:
这取决于你想要从分析中看到什么 . 简单的时间指标可以由(bash)给出 .
甚至'/ usr / bin / time'也可以使用'--verbose'标志输出详细的指标 .
要检查每个函数给出的时间度量并更好地了解函数花费的时间,可以在python中使用内置的cProfile .
进入更详细的指标,如性能,时间不是唯一的指标 . 你可以担心内存,线程等
分析选项:
这些是我倾向于使用的一些常见的 . 但是如果你想了解更多信息,请尝试阅读本文book这是一本非常好的书,首先考虑到性能 . 您可以转到使用Cython和JIT(即时)编译的python的高级主题 .
当我不是服务器上的root用户时,我使用lsprofcalltree.py并运行我的程序,如下所示:
然后我可以使用任何与callgrind兼容的软件打开报告,例如qcachegrind
另外值得一提的是GUI cProfile dump viewer RunSnakeRun . 它允许您进行排序和选择,从而放大程序的相关部分 . 图中矩形的大小与所花费的时间成比例 . 如果将鼠标悬停在矩形上,则会突出显示表格中的调用以及 Map 上的任何位置 . 双击矩形时,它会放大该部分 . 它将显示谁调用该部分以及该部分调用的内容 .
描述性信息非常有用 . 它显示了该位的代码,在处理内置库调用时可能会有所帮助 . 它告诉您查找代码的文件和行 .
也想指出OP说'剖析',但看起来他的意思是“时机” . 请记住,在分析时程序运行速度会变慢 .
@ Maxy对this answer的评论帮助了我,我认为它应该得到自己的答案:我已经有了cProfile生成的.pstats文件,我不想用pycallgraph重新运行,所以我使用了gprof2dot,得到了漂亮的svgs :
和BLAM!
它使用点(与pycallgraph使用的相同),因此输出看起来相似 . 我得到的印象是gprof2dot丢失的信息较少:
在研究这个主题时,我遇到了一个名为SnakeViz的便利工具 . SnakeViz是一个基于Web的分析可视化工具 . 它非常易于安装和使用 . 我使用它的常用方法是使用
%prun
生成一个stat文件,然后在SnakeViz中进行分析 .使用的主要技术是 Sunburst chart ,如下所示,其中函数调用的层次结构被安排为以角度宽度编码的弧和时间信息的层 .
最好的是你可以与图表互动 . 例如,要放大一个可以单击一个弧,并且弧及其后代将被放大为新的旭日以显示更多细节 .
pprofile
line_profiler
(已在此处展示)也启发了pprofile,其描述如下:它提供的行粒度为
line_profiler
,是纯Python,可以用作独立命令或模块,甚至可以生成可以使用[k|q]cachegrind
轻松分析的callgrind格式文件 .vprof
还有vprof,一个Python包描述为:
在Joe Shaw关于多线程代码没有按预期工作的回答之后,我认为cProfile中的
runcall
方法只是围绕profiled函数调用进行self.enable()
和self.disable()
调用,所以你可以自己做这个并且拥有你想要的任何代码 . - 对现有代码的干扰最小 .在Python中处理分析的新工具是PyVmMonitor:http://www.pyvmmonitor.com/
它有一些独特的功能,如
将探查器附加到正在运行的(CPython)程序
使用Yappi集成进行按需分析
在另一台机器上的配置文件
多个进程支持(多处理,django ......)
实时采样/ CPU视图(带时间范围选择)
通过cProfile / profile集成进行确定性分析
分析现有的PStats结果
打开DOT文件
Programatic API访问
按方法或行分组样本
PyDev集成
PyCharm集成
注意:它是商业的,但是免费的开源 .
Simplest 和 quickest 找到所有时间的方式 .
在浏览器中绘制饼图 . 最大的一块是问题功能 . 非常简单 .
还有一个名为statprof的统计分析器 . 它更适合像游戏这样的软实时应用程序,但可能没有cProfile那么精确 .
version in pypi有点旧,所以可以通过指定the git repository与
pip
一起安装:你可以像这样运行它:
另见https://stackoverflow.com/a/10333592/320036
cProfile非常适合快速分析,但大部分时间它都以错误结束 . 函数runctx通过正确初始化环境和变量来解决这个问题,希望它对某些人有用:
Python包含一个名为cProfile的探查器 . 它不仅给出了总运行时间,还给出了每个函数的单独时间,并告诉您每个函数被调用了多少次,这样可以很容易地确定应该在哪里进行优化 .
您可以在代码中或从解释器中调用它,如下所示:
更有用的是,您可以在运行脚本时调用cProfile:
为了使它更容易,我制作了一个名为'profile.bat'的小批处理文件:
所以我要做的就是运行:
我明白了:
编辑:更新了PyCon 2013中一个 Headers 为Python Profiling的视频资源的链接
Also via YouTube .
一个很好的分析模块是line_profiler(使用脚本kernprof.py调用) . 它可以下载here .
我的理解是cProfile只提供有关每个函数花费的总时间的信息 . 所以各行代码都没有定时 . 这是科学计算中的一个问题,因为通常一条线路可能需要花费很多时间 . 另外,正如我记得的那样,cProfile并没有 grab 我在numpy.dot上花费的时间 .
要添加到https://stackoverflow.com/a/582337/1070617,
我编写了这个模块,允许您使用cProfile并轻松查看其输出 . 更多这里:https://github.com/ymichael/cprofilev
另请参阅:http://ymichael.com/2014/03/08/profiling-python-with-cprofile.html关于如何理解收集的统计信息 .
我最近创建了tuna,用于可视化Python运行时和导入配置文件;这在这里可能会有所帮助 .
安装时
创建运行时配置文件
或导入配置文件(需要Python 3.7)
然后只需在文件上运行金枪鱼
https://github.com/amoffat/Inspect-Shell
你可以使用它(和你的 Watch ) .
有很多很棒的答案,但他们要么使用命令行,要么使用一些外部程序来分析和/或排序结果 .
我真的错过了我可以在我的IDE(eclipse-PyDev)中使用的一些方法,而无需触及命令行或安装任何东西 . 所以在这里 .
无需命令行进行性能分析
有关详细信息,请参阅docs或其他答案 .
前段时间我制作了pycallgraph,用Python代码生成可视化 . Edit: 我已更新该示例以使用最新版本 .
在
pip install pycallgraph
并安装GraphViz之后,您可以从命令行运行它:或者,您可以分析代码的特定部分:
这些中的任何一个都将生成类似于下图的
pycallgraph.png
文件:python wiki是一个分析资源的好页面:http://wiki.python.org/moin/PythonSpeed/PerformanceTips#Profiling_Code
和python文档一样:http://docs.python.org/library/profile.html
如Chris Lawlor所示cProfile是一个很棒的工具,可以很容易地用于打印到屏幕上:
或提交:
PS>如果您使用的是Ubuntu,请确保安装python-profile
如果输出到文件,则可以使用以下工具获得良好的可视化效果
PyCallGraph:一种创建调用图图像的工具
安装:
跑:
视图:
您可以使用任何您喜欢的方式来查看png文件,我使用了gimp
不幸的是我常常得到
dot:图形对于cairo-renderer位图来说太大了 . 按比例缩小0.257079以适应
这让我的图像变得非常小 . 所以我通常创建svg文件:
PS>确保安装graphviz(提供点程序):
通过@maxy / @quodlibetor使用gprof2dot替代绘图:
它's worth pointing out that using the profiler only works (by default) on the main thread, and you won' t如果您使用它们,则从其他线程获取任何信息 . 这可能是一个问题,因为在profiler documentation中完全没有提及 .
如果您还想要分析线程,您需要查看文档中的threading.setprofile() function .
您还可以创建自己的
threading.Thread
子类来执行此操作:并使用
ProfiledThread
类而不是标准类 . 它可能会给你更多的灵活性,但是我很有 Value ,特别是如果你使用的第三方代码不会使用你的类 .我的方法是使用yappi(https://code.google.com/p/yappi/) . 它与RPC服务器结合起来特别有用,其中(甚至仅用于调试)您可以注册方法来启动,停止和打印分析信息,例如:通过这种方式:
然后,当您的程序工作时,您可以随时通过调用
startProfiler
RPC方法启动探查器,并通过调用printProfiler
(或修改rpc方法将其返回给调用者)将分析信息转储到日志文件中并获得此类输出:它对于短脚本可能不是很有用,但有助于优化服务器类型的进程,特别是考虑到
printProfiler
方法可以多次调用以分析和比较,例如,不同的程序使用场景 .