2019年1月23日星期三

好用的 Python Profile(性能/耗时分析)工具

Matlab的profile工具非常好用,在Python里似乎没有类似好用的工具。PyCharm Professional版自带profile工具,而Community版不自带profile工具,只能自寻profile方案。Visual Studio似乎可以profile,但那套工具太大,平时并不想打开写python项目。

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
然后就会在弹出一个snakeviz的本地网页,可以在网页上自由点击查看哪个代码最耗时,非常直观方便:
图片摘自snakeviz官网
其他图形化工具:我试过gprof2dot,感觉总体上不如snakeviz简单、直接、美观。简单方面,用gprof2dot前需要安装graphviz,安装完成后还需要把graphviz安装目录下的bin文件夹添加到环境路径Path,而snakeviz只需pip安装即可。直接、美观方面,gprof2dot会把结果生成为图片,图片效果不如snakeviz的网页美观,如果profile的脚本较为复杂的话,图片过大内容过于密集,很不方便查看。

目前我的Python Profile做法就是这样。

最后还是想说一句,Python作为免费软件,在Profile的便利和美化程度上确实没法跟收费软件Matlab相比(另外帮助文档也是Matlab远胜),人家收费还是有道理的。

IPv6 的 fe80开头的地址

fe80开头的 ipv6 地址不是公网地址,没人给你分ip,自动协商的地址,通常无法用于上网。 现在各大运营商用的ipv6: 电信是240e开头的(240e::/20) 移动是2409开头的(2409:8000::/20) 联通是2408开头的(2408:8000::/20)