Python 性能分析工具简介

性能分析和调优工具简介

总会遇到一个时候你会想提高程序执行效率,想看看哪部分耗时长成为瓶颈,想知道程序运行时内存和CPU使用情况。这时候你会需要一些方法对程序进行性能分析和调优。

By Context Manager

可以上下文管理器自己实现一个计时器, 参见之前的介绍 timeit 文章里做的那样,通过定义类的 __enter____exit__ 方法来实现对管理的函数计时, 类似如:

使用方式如下:

By Decorator

然而我认为装饰器的方式更加优雅

使用就很简单了:

运行结果:

系统自带的time命令

使用示例如下:

上面的结果说明: 执行脚本消耗0.79sCPU时间, 0.18秒执行内核函数消耗的时间,总共0.977s时间。
其中, total时间 - (user时间 + system时间) = 消耗在输入输出和系统执行其它任务消耗的时间

python timeit 模块

可以用来做benchmark, 可以方便的重复一个程序执行的次数,来查看程序可以运行多块。具体参考之前写的文章

cProfile

直接看带注释的使用示例吧。

cProfile将分析的结果保存到result.out文件中,但是以二进制形式存储的,想直接查看的话用提供的 pstats 来查看。

截取一个查看test()调用了哪些函数的输出示例:

profile.Profile

cProfile还提供了可以自定义的类,可以更精细的分析, 具体看文档
格式如: class profile.Profile(timer=None, timeunit=0.0, subcalls=True, builtins=True)
下面这个例子来自官方文档:

lineprofiler

lineprofiler是一个对函数进行逐行性能分析的工具,可以参见github项目说明,地址: https://github.com/rkern/line…

示例

通过 kernprof 命令来注入分析,运行结果如下:

hits(执行次数) 和 time(耗时) 值高的地方是有比较大优化空间的地方。

memoryprofiler

类似于”lineprofiler“对基于行分析程序内存使用情况的模块。github 地址:https://github.com/fabianp/me… 。ps:安装 psutil, 会分析的更快。

同样是上面”lineprofiler“中的代码,运行 python -m memory_profiler profile.py 命令生成结果如下:

TODO objgraph

参考资料:

1 5 收藏 评论

相关文章

可能感兴趣的话题



直接登录
跳到底部
返回顶部