Python性能分析与调试

调试能查找并修复软件中的Bug的行为,性能分析,是为软件程序构建一个特殊的配置,并在此基础上收集内存使用情况和时间复杂度星信息.下面我们来看看有那些分析或调试Python的模块或方法!


IPython  :  IPython内建的命令可以对整个.py脚本进行时间和性能测试.

:%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  :  第三方模块line_profiler可以对代码进行分析.有非常直接和详细的报告,能够追踪第三方库里的函数.但                           速度慢.


cProfile  :  cProfile是从Python2.5版本开始引入的C语言扩展模块,该模块可以用来进行确定性能分析.速度快,但是信息                  相对有限,需要进一步调试.


memory_profiler  :  一个不错的内存分析器.

安装  :  $ sudo  easy_install  memory_profiler

            $ sudo  easy_install  psutil         #改善memory_profiler的性能

分析代码  :  $ python  -m  memory_profiler  test.py


objgraph  :  检查内存泄漏,快速生成对象图


pytracemalloc  :  很好用的内存分析第三方模块,开销小,输出详细.


trace  :  Python标准库中自带的追踪模块.

使用  :  $ python  -mtrace  trace  bug.py


faulthandler  :  Python3标准库中自带的模块,用来显示发生段错误的原因

使用  :  import  faulthandler

            faulthandler.enable()


pdb  :  Python标准库中自带的调试模块.

开启调试器  :  import  pdb   

                       pdb.set_trace()

或者      $  python  -mpdb   bug.py

pdb的直接替代者ipdb和pudb,都可通过$ sudo  easy_install  安装


pudb  :  pudb是一个基于控制台的Python调试器,安装简单,且支持可视化全屏操作,支持方向键和Vi命令,也能在需要的              时候与IPython集成.

安装  :  $sudo easy_install pudb

启动调试器  :  $python -m pudb bug.py    或者   $pudb  bug.py

Python性能分析与调试_第1张图片

用户界面的上方时最重要的调试命令,还能在界面中看到被调试的代码,变量,栈和已定义的断点,键q可以退出大多数的菜单,键n可以使调试器移到下一行,也可以用方向键或者vi编辑器风格的j键和k键,把光标移动到适当位置并执行特定的操作,通过键b设置断点.


Pyflakes  :  Pylakes是一个代码分析包,可以用来分析代码,并发现各种潜在的问题,例如:引入但没有用到的模块,没有                       用到的变量.

安装  :  $sudo easy_install pyflakes

分析代码  :  $pyflakes   bug.py


Pylint  :  Pylint是另外一个开源的静态代码分析器,比Pyflakes复杂,且允许用户做更多的事,但分析速度比Pyflakes慢.

安装  :   $sudo  easy_install  pylint

分析代码  :  $pylint  bug.py

Pylint默认输出纯文本的分析结果,但如果有需要可以指定其输出HTML格式的信息.消息类型有以下几种:

[R]  :  重构类型,建议进行重构

[C]  :  惯例类型,违反了代码风格

[W]  :  警告类型,针对小问题的警告信息

[E]  :   错误类型,错误或者潜在的bug 

[F]  :   致命错误类型,发生了致命错误,因此不能进行进一步的分析


Pychecker  :  一个老牌的静态分析工具,开发状态已经不太活跃,Pychecker试图引入每一个模块,并对其进行处理,通过                         代码分析,可以发现各种问题.

安装  :  下载源代码编译安装

分析代码  :  $ pychecker  bug.py


docstrings ( doctest )  :  docstrings是嵌入在代码中的字符串,其内容看上去有点像交互式的会话,这些字符串可用来检                                         验某些假设,或者仅仅把他们看作是一些规范代码,需要用doctest模块运行这些测试.


unittest  :  doctest模块简单易用,unittest(基于Java的流行测试框架JUnit)则更灵活和强大.unittest模块会区分由异引发                    的错误和调用函数而导致的失败.


mock  :  模拟对象(mock)是真实对象的替代物,用来测试真实对象的部分行为.创建一个模拟对象并用它来测试一段代码

安装   :  $ sudo  easy_install  mock


lettuce  :  基于BDD(行为驱动开发)方式的测试,BDD方式背后隐藏的想法是,让不会编程的人,能够以某种方式,编写测试                代码的主体部分.Lettuce框架就是基于BDD的测试框架.

安装  :  $ sudo easy_install   lettuce

测试方式  :  首先在tests目录中建立一个features目录,在features目录中,要包含一个factorial.feature文件和一个                                 steps.py文件,steps.py文件的内容是功能描述和测试代码.执行测试时,首先进入tests目录,然后键入命令$lettuce


标准的Linux测试工具:


time  :  简单的代码运行时间测试工具

使用方式  :  $  time  python  test.py

三个输出变量分别代表:

real  :  表示实际的程序运行时间

user  :  表示在用户态的CPU总时间

sys  :    表示在内核态的CPU总时间


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


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


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

使用方式  :  $ lsof  -p 1234


top/htop  :  进程查看,htop更详细


dstat  :  服务器监控


gdb  :  复杂而又强大的工具,用来追踪代码.

安装  :  $ sudo apt-get install  gdb  python-dbg

使用方式  :  $ gdb  -p 1234


 

你可能感兴趣的:(Python)