Python性能分析与调试

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) #用timeit分析一小段代码的性能
:%run test.py #查找脚本中的Bug
:%run -t test.py #对脚本进行时间测试
:%run -p test.py #对都脚本进行性能测试
:%debug #如果程序已经崩溃,debug命令会在启动调试器,并在错误所在行自动设置一个断点,然后进入调试模式.
ipdb > list #list或者l命令列出代码
ipdb > bt #查看调用栈
ipdb > u #在调用栈中返回上一级
ipdb > d #在调用栈中进入下一级
#除此之外还可以在调试模式中执行任意代码
ipdb > print(a)
#如果不需要完整的IPython调试器,也可以通过以下方式开启一个IPython
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
#改善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

pudb
用户界面的上方是最重要的调试命令,还能在界面中看到被调试的代码,变量,栈和已定义的断点,键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试图引入每一个模块,并对其进行处理,通过代码分析,可以发现各种问题。

1
2
3
4
#安装:下载源代码编译安装
#分析代码
$ pychecker bug.py

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:简单的代码运行时间测试工具。

1
2
#使用方式
$ time python test.py

三个输出变量分别代表:

  • real:表示实际的程序运行时间
  • user:表示在用户态的CPU总时间
  • sys:表示在内核态的CPU总时间

strace:用来追踪fork()出来的子进程。

ltrace:与trace类似,不同的是它输出的是库函数的调用。

lsof:lsof可以用来指出你在ltrace/strace中看到的句柄数值的意义。

1
2
#使用方式
$ lsof -p 1234

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子集为科学计算设计的运行时编译器,非常适合处理科学计算问题。

文章目录
  1. 1. Python测试库
    1. 1.1. IPython:IPython内建的命令可以对整个.py脚本进行时间和性能测。
    2. 1.2. time:python标准库中自带的模块,简单的计时器。
    3. 1.3. timeit:Python标准库中自带的模块,是一个用来测试代码执行时间的模块.容易实现和理解但过于简单。
    4. 1.4. pstats:Python标准库中自带的模块,可以使用Stats对象以编程的方式检查分析结果。
    5. 1.5. profile:Python标准库中自带的分析模块,使用简单。
    6. 1.6. hotshot:Python标准库中自带的分析模块和profile类似,但是用C语言写的,速度更快。
    7. 1.7. line_profiler/kernprof:第三方模块line_profiler可以对代码进行分析.有非常直接和详细的报告,能够追踪第三方库里的函数,但 速度慢。
    8. 1.8. cProfile:cProfile是从Python2.5版本开始引入的c语言扩展模块,该模块可以用来进行确定性能分析.速度快,但是信息相对有限,需要进一步调试。
    9. 1.9. runsnake :runsnake 是一个可视化工具,用于显示cProfile 创建的统计文件—你只需要看它生成的图像就可以快速意识到哪个函数开销最大。
    10. 1.10. memory_profiler:一个不错的内存分析器。
    11. 1.11. profilehooks:用于分析函数的装饰器集合。
    12. 1.12. objgraph:检查内存泄漏,快速生成对象图。
    13. 1.13. pytracemalloc:很好用的内存分析第三方模块,开销小,输出详细。
    14. 1.14. Guppy:该项目有一个内存堆的调查工具叫作heapy,可以让你查看Python 堆中对象的数量以及每个对象的大小。
    15. 1.15. dowser :dowser 可以在代码运行时钩入名字空间并通过CherryPy 接口在一个Web 服务器上提供一个实时的变量实例图。每个被追踪对象都有一个走势图,让你可以看到某个对象的数量是否在增长。这在分析长期运行的进程时很有用。
    16. 1.16. trace:Python标准库中自带的追踪模块。
    17. 1.17. faulthandler:Python3标准库中自带的模块,用来显示发生段错误的原因。
    18. 1.18. pdb:Python标准库中自带的调试模块。
    19. 1.19. pudb:pudb是一个基于控制台的Python调试器,安装简单,且支持可视化全屏操作,支持方向键和Vi命令,也能在需要的时候与IPython集成。
    20. 1.20. Pyflakes:Pylakes是一个代码分析包,可以用来分析代码,并发现各种潜在的问题,例如:引入但没有用到的模块,没有用到的变量。
    21. 1.21. Pylint:Pylint是另外一个开源的静态代码分析器,比Pyflakes复杂,且允许用户做更多的事,但分析速度比Pyflakes慢。
    22. 1.22. Pychecker:一个老牌的静态分析工具,开发状态已经不太活跃,Pychecker试图引入每一个模块,并对其进行处理,通过代码分析,可以发现各种问题。
    23. 1.23. docstrings ( doctest ) :docstrings是嵌入在代码中的字符串,其内容看上去有点像交互式的会话,这些字符串可用来检验某些假设,或者仅仅把他们看作是一些规范代码,需要用doctest模块运行这些测试。
    24. 1.24. unittest:doctest模块简单易用,unittest(基于Java的流行测试框架JUnit)则更灵活和强大.unittest模块会区分由异引发的错误和调用函数而导致的失败。
    25. 1.25. mock:模拟对象(mock)是真实对象的替代物,用来测试真实对象的部分行为.创建一个模拟对象并用它来测试一段代码。
    26. 1.26. lettuce:基于BDD(行为驱动开发)方式的测试,BDD方式背后隐藏的想法是,让不会编程的人,能够以某种方式,编写测试 代码的主体部分.Lettuce框架就是基于BDD的测试框架。
  2. 2. 标准的Linux测试工具:
    1. 2.1. time:简单的代码运行时间测试工具。
    2. 2.2. strace:用来追踪fork()出来的子进程。
    3. 2.3. ltrace:与trace类似,不同的是它输出的是库函数的调用。
    4. 2.4. lsof:lsof可以用来指出你在ltrace/strace中看到的句柄数值的意义。
    5. 2.5. top/htop:进程查看,htop更详细。
    6. 2.6. dstat:服务器监控。
    7. 2.7. gdb:复杂而又强大的工具,用来追踪代码。
  3. 3. 可视化工具
    1. 3.1. KCacheGind/pyprof2calltree:这套工具可以把cProfile输出结果转化成可视化数据图表。
    2. 3.2. RunSnakeRun:这个工具也可以把cProfile的输出结果可视化,还带有方块图和可排序列表。
    3. 3.3. gprof2dot:Gprof2Dot可将多种Profiler的数据转成Graphviz可处理的图像表述。配合dot命令,即可得到不同函数所消耗的时间分析图。
    4. 3.4. vprof:也是一个不错的工具来提供交互式的分析数据可视化,他是针对文件进行执行并分析,并在浏览器中生成可视化图标。
    5. 3.5. Pyflame:可直接分析当前在运行的Python进程,收集完整的Python栈格式化数据使之能生成火焰图(flame graph)具有低开销适用于没有明确针对分析器设计的程序,只支持Linux。
  4. 4. 常见的优化工具
    1. 4.1. PyPy:Python解释器的另一种版本,使用JIT即时编译技术进行优化。
    2. 4.2. Cython:Python的超集,将Python编译成C/C++代码进行优化。
    3. 4.3. Numba:Python的一个模块,可以控制Python解释器把函数转化为机器码,实现高性能的纯Python代码。
    4. 4.4. Parakeet:一种用Python子集为科学计算设计的运行时编译器,非常适合处理科学计算问题。
|