1. 程式人生 > >python 學習彙總32:timeit-程式測試( tcy)

python 學習彙總32:timeit-程式測試( tcy)

timeit-程式測試    2018/9/6

1.簡單測試程式的執行時間:
     在一段程式的前後都用上time.time(),然後進行相減  
2.timeit
        相對timeit 細粒度,profile 和 pstats  模組提供針對更大程式碼塊的時間度量工具
        選擇傳遞globals=globals(),這會導致程式碼在當前的全域性名稱空間內執行。
    
2.1.函式:
timeit.timeit(stmt ='pass',setup ='pass',timer = <default timer> ,
number = 1000000,globals = None )
用途:
Timer用給定語句設定程式碼和計時器函式建立一個例項,用timeit()執行測試
全域性變數引數指定要在其中執行程式碼的名稱空間
引數:
stmt:  測試程式碼。字串表示式,單個變數,函式。
setup: 這將stmt的環境傳進去。比如各種import和引數什麼的。
timer: 這個引數一般使用不到,具體使用可以參看文件。

    timeit.repeat(stmt ='pass',setup ='pass',timer = <default timer>,repeat = 3,
                    number = 1000000,globals = None )

        Timer用給定語句設定程式碼和計時器函式建立一個例項,用repeat()執行重複測試
        全域性變數引數指定要在其中執行程式碼的名稱空間。
    timeit.default_timer()
        預設定時器time.perf_counter()
2.2.class timeit.Timer(stmt ='pass',setup ='pass',timer = <timer function>  ,
                        globals = None )# 小程式碼片段的定時執行速度類。

    stmt和setup包含多個由";"或換行符分隔語句,不包含多行字串文字。
    預設在timeit的名稱空間內執行;  可以通過傳遞一個名稱空間給全域性變數來控制。

    說明:
        和函式相比多了一個重複呼叫次數。
        度量一條語句執行時間,用timeit()方法。
        該語句和設定引數也可以採取的是不帶引數的可呼叫的物件。

    timeit(number = 1000000 )
        主要語句的時間編號執行。
        執行一次設定語句,返回多次執行主語句所需時間float秒
    autorange(callback = None )
        自動確定呼叫次數timeit()
       repeat(repeat = 3,number = 1000000 )
        重複呼叫timeit()次數
        引數1指定呼叫多少次timeit();引數2指定timeit()測試次數。

 

3.例項
    
1)測試語句1:timeit  
import timeit

# 例項1:timeit-測試語句
a=timeit.timeit('id=a;name=b',setup='a=1000;b="Tom"',number=1000000)
print('1.1.testTime=',a)

# 例項2:timeit-測試語句
s='id=a;name=b';
a=timeit.timeit(stmt=s,setup='a=1000;b="Tom"',number=1000000)
print('1.2.testTime=',a)

# 例項3:timeit-測試語句
s = """\
id=a
name=b
"""
a=timeit.timeit(stmt=s,setup='a=1000;b="Tom"',number=1000000)
print('1.3.testTime=',a)

# 例項4:timeit.Timer-測試語句
a=timeit.Timer('id=a;name=b','a=1000;b="Tom"').timeit(number=1000000)
print('1.4.testTime=',a)

# 例項5:timeit.Timer-測試語句
t=timeit.Timer('id=a;name=b','a=1000;b="Tom"')

a1=t.timeit(number=1000000)
a2=t.repeat(repeat = 3,number = 1000000)
print('1.5.testTime=',a1,a2)

# 例項6:timeit-測試語句
s='L = [i for i in range(n)]';n=100
a=timeit.timeit(stmt=s,number=100000, globals=globals())
print('2.0.testTime=',a)# setup=傳遞一個包含匯入語句

 

2)  測試函式
# 例項1:timeit-測試函式
import timeit

def test(n):
L = [i for i in range(n)]

#if __name__ == '__main__':
a=timeit.timeit("test(100)", setup="from __main__ import test",number=100000)
print('2.1.testTime=',a)  #2.1.testTime= 0.54220718

# 例項2:timeit-測試函式
import timeit

def test(n):
L = [i for i in range(n)]
n=100

a=timeit.timeit('test(n)',number=100000, globals=globals())
print('2.2.testTime=',a)#2.2.testTime= 0.536649002

# 例項3:timeit-測試多個函式
def f(x):return x**2
def g(x):return x**4
def h(x):return x**8

a=timeit.timeit('[func(42) for func in (f,g,h)]',number=100000,globals=globals())
print('2.3.testTime=',a)

#例項4:timeit.repea-測試重複次數
#repeat和timeit用法相似,多一個repeat引數(重複測試次數=3.),返回時間列表

a=timeit.repeat("test(100)", setup="from __main__ import test",number=100000,repeat=3)
print('3.1.testTime=',a,'min=',min(a))

#例項5:timeit.Timer-測試重複次數
t=timeit.Timer(stmt ='test(n)',setup ='n=100',globals = globals())
a1=t.timeit(number=100000)
a2=t.repeat(repeat = 3,number = 100000)
print('3.2.testTime=',a1,a2,'min=',min(a2))

 

結果輸出

1.1.testTime=  0.04432365000000005
1.2.testTime=  0.04307258300000005
1.3.testTime=  0.044008316999999963
1.4.testTime=  0.04538698299999999
1.5.testTime= 0.044759738999999965 [0.04225173900000001, 0.041612761, 0.04221409500000006]
2.0.testTime=  0.5714974949999999
2.1.testTime=  0.531626156
2.2.testTime=  0.534958423
2.3.testTime=  0.2584878100000001
3.1.testTime= [0.5270306009999999, 0.5233380219999999, 0.5257756219999998] min= < FONT> 0.5233380219999999
3.2.testTime= 0.5361430020000002 [0.5355201569999997, 0.5308390449999996, 0.5279976230000001] min= 0.5279976230000001