调试能查找并修复软件中的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
用户界面的上方时最重要的调试命令,还能在界面中看到被调试的代码,变量,栈和已定义的断点,键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