Python调试方法及性能调试

python -m pdb myscript.py #注意这会重启myscript.py

可以在程序中这么设置断点:
import pdb; pdb.set_trace()

可以修改变量的值,但是要注意,前面加上!比如要修改final的值,应该这样!final="newvalue"

支持的命令:
    p 打印变量
    n next
    step 细点运行
    c continue
    l list
    a args 打印当前函数的参数
    condition bpnumber [condition]
    clear/disable/enable 清除/禁用/使能断点
    q quit


python profiler性能分析

一种方法:

if __name__ == "__main__":

       import profile

       profile.run("foo()")


另一种命令行方法:python -m profile prof1.py

 

profile的统计结果分为ncalls, tottime, percall, cumtime, percall, filename:lineno(function)等若干列:

ncalls

 

函数的被调用次数

 

tottime

 

函数总计运行时间,除去函数中调用的函数运行时间

 

percall

 

函数运行一次的平均时间,等于tottime/ncalls

 

cumtime

 

函数总计运行时间,含调用的函数运行时间

 

percall

 

函数运行一次的平均时间,等于cumtime/ncalls

 

filename:lineno(function)

 

函数所在的文件名,函数的行号,函数名

 

 

用pstats自定义报表

       profile解 决了我们的一个需求,还有一个需求:以多种形式查看输出,我们可以通过 profile的另一个类Stats来解决。在这里我们需要引入一个模块pstats,它定义了一个类Stats,Stats的构造函数接受一个参数—— 就是profile的输出文件的文件名。Stats提供了对profile输出结果进行排序、输出控制等功能,如我们把前文的程序改为如下:

# …

if __name__ == "__main__":

       import profile

       profile.run("foo()", "prof.txt")

       import pstats

       p = pstats.Stats("prof.txt")

       p.sort_stats("time").print_stats()

 

引入pstats之后,将profile的输出按函数占用的时间排序

 

Stats有若干个函数,这些函数组合能给我们输出不同的profile报表,功能非常强大。下面简单地介绍一下这些函数:

strip_dirs()

 

用以除去文件名前名的路径信息。

 

add(filename,[…])

 

profile的输出文件加入Stats实例中统计

 

dump_stats(filename)

 

Stats的统计结果保存到文件

 

sort_stats(key,[…])

 

最重要的一个函数,用以排序profile的输出

 

reverse_order()

 

Stats实例里的数据反序重排

 

print_stats([restriction,…])

 

Stats报表输出到stdout

 

print_callers([restriction,…])

 

输出调用了指定的函数的函数的相关信息

 

print_callees([restriction,…])

 

输出指定的函数调用过的函数的相关信息

 

这里最重要的函数就是sort_stats和print_stats,通过这两个函数我们几乎可以用适当的形式浏览所有的信息了,下面来详细介绍一下。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wysfjg.html