最近阅读了 《Python 高性能编程》,同时也查阅了很多相关的文档和资料,整理于此博客加深理解以及备忘。
第一篇是关于几种常用分析工具是使用简介。
性能分析最基本的就是查看某段代码的运行时间,这个最常规简单的方式就是通过 Python 的 time 模块进行计算,代码示例如下:
def add(a, b)
retutn a + b
import time
# 代码运行开始前的时间
start = time.time()
result = add(1, 2)
# 代码运行结束后的时间
end = time.time()
# 计算时间消耗
escape = end - start
# 打印查看
print(escape)
Python 提供了 timeit 模块来测量代码的执行速度,可以用该模块来对各种简单的语句进行计时
代码示例:
python3.6 -m timeit -n 5 -r 5 -s "import module_name" "module_name.func(*args, **kwargs)"
简要对上面的语句作下说明:
使用 timeit 模块有几点注意:
In [1]: from module_name import func_name
In [2]: %timeit func_name(*args, **kwargs)
下面是执行 《Python 高性能编程》 中 Julial 代码的分析记录:
Unix 提供了系统命令 time, 可以用它来记录程序耗费的各方面时间
/usr/bin/time -lp demo.py
-p 命令会显示三个结果:
关于 time 命令就记这些吧,基本够用,详细用法可以参与这篇文档: time 命令
cProfile 是标准库内建的分析工具,可以用来测量每一个函数的执行时间。其基本的使用命令如下:
python -m cProfile -s cumulative cp02/demo01.py
-m 表示执行 cProfile 模块, -s cumulative 表示对每个函数累计花费时间进行排序,可以让我们很直观的看到哪一部分的代码执行的最慢。
其结果如下:
更好用的方式是生成一个统计文件,然后通过 pstats 模块进行分析,命令如下:
python -m cProfile -o profile.stats cp02/demo01.py
这样将统计结果存储到 profile.stats 文件之后就可以通过 pstats 模块来查看了,代码如下:
import pstats
#
# p = pstats.Stats('profile.stats')
# p.sort_stats("cumulative")
# 输出累计时间报告
p.print_stats()
# 输出调用者的信息
p.print_callers()
# 输出哪个函数调用了哪个函数
p.print_callees()
其各项的含义如下:
通过 cProfile 可以快速的定位出现性能瓶颈的函数,然后在针对函数进行进一步的分析。下面是逐行代码分析的 line_profiler 工具
line_profiler 可以对函数进行逐行分析,是调查 Python 的 CPU 密集型问题最强大的工具。通常的使用步骤是先用 cProfile 进行函数分析,
然后在对有性能瓶颈的函数进行逐行分析。
pip install line_profiler
kernprof -l cp02/demo01.py
-l 参数那个了表示逐行分析,另外还可以有 -v 参数用来显示输出,不加的话会生成一个 .lprof 的输出文件。得到文件后可以用下面命令查看:
python -m line_profiler demo01.py.lprof
分析 《Python 高性能编程》中的 Julial 中的函数得到的结果如下:
其各项含义为:
注意,在下面提到的 memory_profiler 中也会有一个 @profile 的装饰器,会和 line_profiler 的冲突,使用的时候不要弄混了。
memory_profiler 模块能够逐行测量内存的占用情况
pip install psutil # 需要先安装 psutil 模块
pip install memory_profiler
命令如下:
python -m memory_profiler cp02/demo01.py
各项含义为
另外 memory_profiler 提供了一个 mprof 进行可视化的内存展示,使用该命令需要安装 matplotlib
pip install matplotlib
然后执行如下命令:
mprof run cp02/demo01.py # 生成统计文件
mprof plot mprofile_20170904220625.dat # 展示统计文件
OK ,上面这些工具已经足够我们进行性能分析了,另外, 《Python 高性能编程》中还提到了 dowser 和 heapy
工具,不过在自己学习的时候发现并不支持 Python3, 因此就暂时研究,后面如果有机会用到的话在做深入的学习吧。