Line_profiler需要在函数前添加@profile装饰器,这样的方式可能不够优雅便利。
目前我的profile方案如下:
第1步. 生成原始文件:用cProfile生成原始的性能分析文件
cProfile是Python默认的性能分析器,选它没错的。可以在python脚本里运行,例如:
import cProfile
import re
cProfile.run('re.compile("ccc")', filename='result.out')
也可以在cmd里运行,例如:
python -m cProfile -o result.out ccc.py
第2步. 表格化分析原始文件:用pstats表格化分析由cProfile生成的原始文件
cProfile生成的原始文件并不易读,需要借助其他工具来处理原始文件。pstats模块可以以表格化的方式来处理cProfile生成的原始文件。
# 创建Stats对象
p = pstats.Stats(file_path)
# 按照运行时间和函数名进行排序
# p.strip_dirs().sort_stats("cumulative", "name").print_stats(0.5)
p.strip_dirs().sort_stats("cumulative", "name").print_stats(30)
# 按照函数名排序,只打印前3行函数的信息, 参数还可为小数,表示前百分之几的函数信息
# 如果想知道有哪些函数调用了ccc
# p.print_callers(0.5, "ccc")
# 查看ccc()函数中调用了哪些函数
# p.print_callees("ccc")
第3步. 图形化分析原始文件:目前推荐snakeviz
pip安装snakeviz后,在Anaconda prompt里运行如下命令:
snakeviz result.out其他图形化工具:我试过gprof2dot,感觉总体上不如snakeviz简单、直接、美观。简单方面,用gprof2dot前需要安装graphviz,安装完成后还需要把graphviz安装目录下的bin文件夹添加到环境路径Path,而snakeviz只需pip安装即可。直接、美观方面,gprof2dot会把结果生成为图片,图片效果不如snakeviz的网页美观,如果profile的脚本较为复杂的话,图片过大内容过于密集,很不方便查看。
目前我的Python Profile做法就是这样。
最后还是想说一句,Python作为免费软件,在Profile的便利和美化程度上确实没法跟收费软件Matlab相比(另外帮助文档也是Matlab远胜),人家收费还是有道理的。



