By Context Manager
可以上下文管理器自己实现一个计时器, 通过定义类的 __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)
下面这个例子来自官方文档:
line_profiler
line_profiler是一个对函数进行逐行性能分析的工具
示例
通过 kernprof 命令来注入分析,运行结果如下:
hits(执行次数) 和 time(耗时) 值高的地方是有比较大优化空间的地方。
memory_profiler
类似于”line_profiler“对基于行分析程序内存使用情况的模块。
同样是上面”lineprofiler“中的代码,运行 python -m memory_profiler profile.py 命令生成结果如下: