Python3 timeit的用法


Python3中的timeit模塊可以用來測試小段代碼的運行時間

其中主要通過兩個函數來實現:timeit和repeat,代碼如下:

def timeit(stmt="pass", setup="pass", timer=default_timer,
           number=default_number, globals=None):
    """Convenience function to create Timer object and call timeit method."""
    return Timer(stmt, setup, timer, globals).timeit(number)

def repeat(stmt="pass", setup="pass", timer=default_timer,
           repeat=default_repeat, number=default_number, globals=None):
    """Convenience function to create Timer object and call repeat method."""
    return Timer(stmt, setup, timer, globals).repeat(repeat, number)

在上面的代碼中可見,無論是timeit還是repeat都是先生成Timer對象,然后調用了Timer對象的timeit或repeat函數。

在使用timeit模塊時,可以直接使用timeit.timeit()、tiemit.repeat(),還可以先用timeit.Timer()來生成一個Timer對象,然后再用TImer對象用timeit()和repeat()函數,后者再靈活一些。

上述兩個函數的入參:

stmt:用於傳入要測試時間的代碼,可以直接接受字符串的表達式,也可以接受單個變量,也可以接受函數。傳入函數時要把函數申明在當前文件中,然后在 stmt = ‘func()’ 執行函數,然后使用 setup = ‘from __main__ import func’

setup:傳入stmt的運行環境,比如stmt中使用到的參數、變量,要導入的模塊等。可以寫一行語句,也可以寫多行語句,寫多行語句時要用分號;隔開語句。

number:要測試的代碼的運行次數,默認100000次,對於耗時的代碼,運行太多次會比較慢,此時建議自己修改一下運行次數

repeat:指測試要重復幾次,每次的結果構成列表返回,默認3次。

 

一、直接使用timeit.timeit()、tiemit.repeat():

import timeit 

print(timeit.timeit(stmt= 'list(i**2 for i in normal_list)',setup = 'normal_list=range(10000)',number=10))
#0.3437936799875755
print(timeit.repeat(stmt= 'list(i**2 for i in normal_list)', setup='normal_list=range(10000)',repeat=2,number=10))
#[0.33649995761778984, 0.3394490767789293]
#setup 為復合語句
print(timeit.timeit(stmt= 'list(i**2 for i in normal_list)',setup = 'a=10000;normal_list=range(a)',number=10))
#0.33272367424748817
print(timeit.repeat(stmt= 'list(i**2 for i in normal_list)', setup='a=10000;normal_list=range(a)',repeat=2,number=10))
#[0.3323106610316342, 0.3356380911962764]

def func():
    normal_list=range(10000)
    L = [i**2 for i in normal_list]

#stmt為函數
print(timeit.timeit("func()", setup="from __main__ import func",number=10))
#0.12436874684622312
print(timeit.repeat("func()", setup="from __main__ import func",repeat=2,number=10))
#[0.12142133435126468, 0.12079555675148601]

直接用函數的方式,速度更快。

 

二、先生成Timer,再調用timeit()、repeat():

import timeit 

#生成timer
timer1 = timeit.Timer(stmt= 'list(i**2 for i in normal_list)',setup = 'normal_list=range(10000)')
#調用timeit和repeat時還傳number和repeat參數
print(timer1.timeit(number=10))
#0.34721554568091145
print(timer1.repeat(repeat=2,number=10))
#[0.3391925079630199, 0.34103400077255097]

#setup 為復合語句
timer1 = timeit.Timer(stmt= 'list(i**2 for i in normal_list)',setup = 'a=10000;normal_list=range(a)')
print(timer1.timeit(number=10))
0.34383463997592467
print(timer1.repeat(repeat=2,number=10))
#[0.34573984832288773, 0.34413273766891006]

#stmt為函數
def func():
    normal_list=range(10000)
    L = [i**2 for i in normal_list]

timer1 = timeit.Timer("func()", setup="from __main__ import func")
print(timer1.timeit(number=10))
#0.1223264363160359
print(timer1.repeat(repeat=2,number=10))
#[0.12266321844246209, 0.1264150395975001]

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM