Python性能分析与调试
调试能查找并修复软件中的Bug的行为,性能分析,是为软件程序构建一个特殊的配置,并在此基础上收集内存使用情况和时间复杂度星信息。下面我们来看看有那些分析或调试Python的模块或方法:
Python测试库
IPython:IPython内建的命令可以对整个.py脚本进行时间和性能测。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| :%timeit range(45) :%run test.py :%run -t test.py :%run -p test.py :%debug ipdb > list ipdb > bt ipdb > u ipdb > d ipdb > print(a) import IPython IPython.embed()
|
time:python标准库中自带的模块,简单的计时器。
timeit:Python标准库中自带的模块,是一个用来测试代码执行时间的模块.容易实现和理解但过于简单。
pstats:Python标准库中自带的模块,可以使用Stats对象以编程的方式检查分析结果。
profile:Python标准库中自带的分析模块,使用简单。
hotshot:Python标准库中自带的分析模块和profile类似,但是用C语言写的,速度更快。
line_profiler/kernprof:第三方模块line_profiler可以对代码进行分析.有非常直接和详细的报告,能够追踪第三方库里的函数,但 速度慢。
cProfile:cProfile是从Python2.5版本开始引入的c语言扩展模块,该模块可以用来进行确定性能分析.速度快,但是信息相对有限,需要进一步调试。
runsnake :runsnake 是一个可视化工具,用于显示cProfile 创建的统计文件—你只需要看它生成的图像就可以快速意识到哪个函数开销最大。
memory_profiler:一个不错的内存分析器。
1 2 3 4 5 6 7 8
| $ sudo easy_install memory_profiler $ sudo easy_install psutil $ python -m memory_profiler test.py
|
profilehooks:用于分析函数的装饰器集合。
objgraph:检查内存泄漏,快速生成对象图。
pytracemalloc:很好用的内存分析第三方模块,开销小,输出详细。
Guppy:该项目有一个内存堆的调查工具叫作heapy,可以让你查看Python 堆中对象的数量以及每个对象的大小。
dowser :dowser 可以在代码运行时钩入名字空间并通过CherryPy 接口在一个Web 服务器上提供一个实时的变量实例图。每个被追踪对象都有一个走势图,让你可以看到某个对象的数量是否在增长。这在分析长期运行的进程时很有用。
trace:Python标准库中自带的追踪模块。
1 2
| $ python -mtrace trace bug.py
|
faulthandler:Python3标准库中自带的模块,用来显示发生段错误的原因。
1 2 3
| import faulthandler faulthandler.enable()
|
pdb:Python标准库中自带的调试模块。
pdb的直接替代者ipdb和pudb,都可通过$ sudo easy_install 安装
1 2 3 4 5 6
| import pdb pdb.set_trace() $ python -mpdb bug.py
|
pudb:pudb是一个基于控制台的Python调试器,安装简单,且支持可视化全屏操作,支持方向键和Vi命令,也能在需要的时候与IPython集成。
1 2 3 4 5 6 7 8
| $sudo easy_install pudb $python -m pudb bug.py $pudb bug.py
|
用户界面的上方是最重要的调试命令,还能在界面中看到被调试的代码,变量,栈和已定义的断点,键q可以退出大多数的菜单,键n可以使调试器移到下一行,也可以用方向键或者vi编辑器风格的j键和k键,把光标移动到适当位置并执行特定的操作,通过键b设置断点。
Pyflakes:Pylakes是一个代码分析包,可以用来分析代码,并发现各种潜在的问题,例如:引入但没有用到的模块,没有用到的变量。
1 2 3 4 5
| $sudo easy_install pyflakes $pyflakes bug.py
|
Pylint:Pylint是另外一个开源的静态代码分析器,比Pyflakes复杂,且允许用户做更多的事,但分析速度比Pyflakes慢。
1 2 3 4 5
| $sudo easy_install pylint $pylint bug.py
|
Pylint默认输出纯文本的分析结果,但如果有需要可以指定其输出HTML格式的信息.消息类型有以下几种:
- [R]:重构类型,建议进行重构
- [C]:惯例类型,违反了代码风格
- [W]:警告类型,针对小问题的警告信息
- [E]:错误类型,错误或者潜在的bug
- [F]+致命错误类型,发生了致命错误,因此不能进行进一步的分析
Pychecker:一个老牌的静态分析工具,开发状态已经不太活跃,Pychecker试图引入每一个模块,并对其进行处理,通过代码分析,可以发现各种问题。
docstrings ( doctest ) :docstrings是嵌入在代码中的字符串,其内容看上去有点像交互式的会话,这些字符串可用来检验某些假设,或者仅仅把他们看作是一些规范代码,需要用doctest模块运行这些测试。
unittest:doctest模块简单易用,unittest(基于Java的流行测试框架JUnit)则更灵活和强大.unittest模块会区分由异引发的错误和调用函数而导致的失败。
mock:模拟对象(mock)是真实对象的替代物,用来测试真实对象的部分行为.创建一个模拟对象并用它来测试一段代码。
lettuce:基于BDD(行为驱动开发)方式的测试,BDD方式背后隐藏的想法是,让不会编程的人,能够以某种方式,编写测试 代码的主体部分.Lettuce框架就是基于BDD的测试框架。
测试方式 :首先在tests目录中建立一个features目录,在features目录中,要包含一个factorial.feature文件和一个steps.py文件,steps.py文件的内容是功能描述和测试代码.执行测试时,首先进入tests目录,然后键入命令$lettuce。
标准的Linux测试工具:
time:简单的代码运行时间测试工具。
三个输出变量分别代表:
- real:表示实际的程序运行时间
- user:表示在用户态的CPU总时间
- sys:表示在内核态的CPU总时间
strace:用来追踪fork()出来的子进程。
ltrace:与trace类似,不同的是它输出的是库函数的调用。
lsof:lsof可以用来指出你在ltrace/strace中看到的句柄数值的意义。
top/htop:进程查看,htop更详细。
dstat:服务器监控。
gdb:复杂而又强大的工具,用来追踪代码。
1 2 3 4 5 6 7
| $ sudo apt-get install gdb python-dbg $ gdb -p 1234(pid) 或者 $ gdb python 1234(pid)
|
可视化工具
KCacheGind/pyprof2calltree:这套工具可以把cProfile输出结果转化成可视化数据图表。
RunSnakeRun:这个工具也可以把cProfile的输出结果可视化,还带有方块图和可排序列表。
gprof2dot:Gprof2Dot可将多种Profiler的数据转成Graphviz可处理的图像表述。配合dot命令,即可得到不同函数所消耗的时间分析图。
vprof:也是一个不错的工具来提供交互式的分析数据可视化,他是针对文件进行执行并分析,并在浏览器中生成可视化图标。
Pyflame:可直接分析当前在运行的Python进程,收集完整的Python栈格式化数据使之能生成火焰图(flame graph)具有低开销适用于没有明确针对分析器设计的程序,只支持Linux。
常见的优化工具
PyPy:Python解释器的另一种版本,使用JIT即时编译技术进行优化。
Cython:Python的超集,将Python编译成C/C++代码进行优化。
Numba:Python的一个模块,可以控制Python解释器把函数转化为机器码,实现高性能的纯Python代码。
Parakeet:一种用Python子集为科学计算设计的运行时编译器,非常适合处理科学计算问题。