当Python代码存在性能瓶颈时,如何检查是哪一部分的代码有问题呢?
CProfile介绍
CProfile是测量Python性能的工具之一。它提供Python接口,也提供命令行版本的执行参数。
CProfile能够提供每个函数的执行时间、执行次数等信息,帮助我们寻找python程序的性能瓶颈。
CProfile接口
- 准备
# import module
import cProfile
- 接口调用
# command 是字符串形式的python代码
cProfile.run(command, outputfile=None, sort=-1)
# 增加本地变量和全局变量
cProfile.runctx(command, globals, locals, outputfile=None, sort=-1)
- Profile对象
Profile对象支持对python代码进行更加精细的性能测试。
主要的方法有
enble(): 开启性能测试
disable():关闭性能测试
create_stats():
print_stats():打印、存储性能信息
dump_stats():
run():
runctx():
runcall():
命令行参数
CProfile支持使用python执行的命令行参数来对程序整体进行性能测试。
# 开启cprofile性能测试
python -m cProfile -o [output file] [python file]
运行结束后将产生*.stats
文件。可以通过以下方式打印:
import pstats
p=pstats.Stats([output file path])
# "cumulative"对每个函数的执行时间进行排序,可以优先看到代码最慢的部分
p.sort_stats("cumulative")
p.print_stats()
# 可以显示函数被哪些函数调用
p.print_callers()
# 可以显示哪个函数调用了哪些函数
p.print_callees()
结果可视化
我们可以使用graphviz
或者snakeviz
工具对CProfile的结果可视化。
grapgviz
# 安装
sudo apt-get install graphviz
# 下载gprof2dot.py
pip install gprof2dot
# 画图
python gprof2dot.py -f pstats [output stats] | dot -Tpng -o [output png]
nakeviz
# 安装
pip install snakeviz
# 选择日志文件运行
snakeviz [output stats]
# 打开浏览器查看
参考链接
https://blog.csdn.net/irving512/article/details/109446870
https://cloud.tencent.com/developer/article/1581156
https://github.com/jrfonseca/gprof2dot