Python调试方法及性能调试(2)

sort_stats() 接受一个或者多个字符串参数,如”time”、”name” 等,表明要根据哪一列来排序,这相当有用,例如我们可以通过用time为key来排序得知最消耗时间的函数,也可以通过cumtime来排序,获知总消耗 时间最多的函数,这样我们优化的时候就有了针对性,也就事半功倍了。sort_stats可接受的参数如下:

‘ncalls’

 

被调用次数

 

‘cumulative’

 

函数运行的总时间

 

‘file’

 

文件名

 

‘module’

 

文件名

 

‘pcalls’

 

简单调用统计(兼容旧版,未统计递归调用)

 

‘line’

 

行号

 

‘name’

 

函数名

 

‘nfl’

 

Name/file/line

 

‘stdname’

 

标准函数名

 

‘time’

 

函数内部运行时间(不计调用子函数的时间)

 

       另一个相当重要的函数就是print_stats——用以根据最后一次调用sort_stats之后得到的报表。

 

cProfile

python -m cProfile -s time test.py

 

timeit

如果我们某天心血来潮,想要向list里append一个元素需要多少时间或者想知道抛出一个异常要多少时间,那使用profile就好像用牛刀杀鸡了。这时候我们更好的选择是timeit模块。


timeit除了有非常友好的编程接口,也同样提供了友好的命令行接口。首先来看看编程接口。timeit模块包含一个类Timer,它的构造函数是这样的:

class Timer( [stmt='pass' [, setup='pass' [, timer=<timer function>]]])

stmt参数是字符串形式的一个代码段,这个代码段将被评测运行时间;setup参数用以设置stmt的运行环境;timer可以由用户使用自定义精度的计时函数。

     

 timeit.Timer有三个成员函数,下面简单介绍一下:

timeit( [number=1000000])

timeit()执行一次Timer构造函数中的setup语句之后,就重复执行number次stmt语句,然后返回总计运行消耗的时间。

repeat( [repeat=3 [, number=1000000]])

repeat()函数以number为参数调用timeit函数repeat次,并返回总计运行消耗的时间

print_exc( [file=None])

print_exc()函数用以代替标准的tracback,原因在于print_exc()会输出错行的源代码,如:

>>> t = timeit.Timer("t = foo()/nprint t")      ßtimeit的代码段

>>> t.timeit()

 

Traceback (most recent call last):

 File "<pyshell#12>", line 1, in -toplevel-

    t.timeit()

 File "E:/Python23/lib/timeit.py", line 158, in timeit

    return self.inner(it, self.timer)

 File "<timeit-src>", line 6, in inner

    foo()         ß标准输出是这样的

NameError: global name 'foo' is not defined

>>> try:

       t.timeit()

except:

       t.print_exc()

 

      

Traceback (most recent call last):

 File "<pyshell#17>", line 2, in ?

 File "E:/Python23/lib/timeit.py", line 158, in timeit

    return self.inner(it, self.timer)

 File "<timeit-src>", line 6, in inner

    t = foo()        ßprint_exc()的输出是这样的,方便定位错误

NameError: global name 'foo' is not defined

 

       除了可以使用timeit的编程接口外,我们也可以在命令行里使用timeit,非常方便:

python timeit.py [-n N] [-r N] [-s S] [-t] [-c] [-h] [statement ...]

其中参数的定义如下:

-n N/--number=N

       statement语句执行的次数

-r N/--repeat=N

       重复多少次调用timeit(),默认为3

-s S/--setup=S

       用以设置statement执行环境的语句,默认为”pass”

-t/--time

       计时函数,除了Windows平台外默认使用time.time()函数,

-c/--clock

       计时函数,Windows平台默认使用time.clock()函数

-v/--verbose

       输出更大精度的计时数值

-h/--help

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

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