timeit模塊:
-
timeit 模塊定義了接受兩個參數的 Timer 類。兩個參數都是字符串。 第一個參數是你要計時的語句或者函數。 傳遞給 Timer 的第二個參數是為第一個參數語句構建環境的導入語句。 從內部講, timeit 構建起一個獨立的虛擬環境, 手工地執行建立語句,然后手工地編譯和執行被計時語句。
-
一旦有了 Timer 對象,最簡單的事就是調用 timeit(),它接受一個參數為每個測試中調用被計時語句的次數,默認為一百萬次;返回所耗費的秒數。
- Timer 對象的另一個主要方法是 repeat(), 它接受兩個可選參數。 第一個參數是重復整個測試的次數,第二個參數是每個測試中調用被計時語句的次數。 兩個參數都是可選的,它們的默認值分別是 3 和1000000。 repeat() 方法返回以秒記錄的每個測試循環的耗時列表。Python 有一個方便的 min 函數可以把輸入的列表返回成最小值,如: min(t.repeat(3, 1000000))
測試一個列表推導式與for循環的時間
import timeit foooo = """ sum = [] for i in range(1000): sum.append(i) """ print(timeit.timeit(stmt="[i for i in range(1000)]", number=100000)) print(timeit.timeit(stmt=foooo, number=100000)) #res: #3.2855970134734345 #8.19918414604134
使用列表推導式要比正常使用list追加元素 通過10w次循環會快上近5秒左右,速度快上近三倍。
timeit 模塊抽象出了;兩個可以直接使用的方法,包了一層可以讓我們不用關心內部的實現,下面看一下模塊里面的代碼:
def timeit(stmt="pass", setup="pass", timer=default_timer, number=default_number): """Convenience function to create Timer object and call timeit method.""" return Timer(stmt, setup, timer).timeit(number) def repeat(stmt="pass", setup="pass", timer=default_timer, repeat=default_repeat, number=default_number): """Convenience function to create Timer object and call repeat method.""" return Timer(stmt, setup, timer).repeat(repeat, number)
可以看到這兩個方法都是對Timer類包了一層這幾個參數:
stmt: 這個參數就是statement,可以把要進行計算時間的代碼放在里面。他可以直接接受字符串的表達式,也可以接受單個變量,也可以接受函數。
setup: 這個參數可以將stmt的環境傳進去。比如各種import和參數什么的。
timer: 這個參數一般使用不到,具體使用可以參看文檔。
Timer類下面還有repeat和timeit方法 使用也非常方便就是 timeit.timeit 和 timeit.repeat。
一個就是上面例子的timeit,一個就是repeat 其實repeat就比timeit多了一個執行Timer次數的參數。這個執行次數會以數組的形式返回.
import timeit foooo = """ sum = [] for i in range(1000): sum.append(i) """ print(timeit.repeat(stmt="[i for i in range(1000)]", repeat=2, number=100000)) print(min(timeit.repeat(stmt="[i for i in range(1000)]", repeat=2, number=100000))) #res: #[3.4540683642063277, 3.300991128415932] #3.321008256502136
我們可以根據此,對所有執行時間取min最小值,平均值,最大值得到我們想要的數據。
# coding: utf-8 import timeit # 初始化類 x = """ say_hi.ParseFromString(p) """ y = """ simplejson.loads(x) """ print(timeit.timeit(stmt=x, setup="import say_hi_pb2;" "say_hi = say_hi_pb2.SayHi();" "say_hi.id = 13423;" "say_hi.something = 'axiba';" "say_hi.extra_info = 'xiba';" "p =say_hi.SerializeToString()", number=1000000)) print(timeit.timeit(stmt=y, setup="import simplejson; " "json={" "'id': 13423," "'something': 'axiba'," "'extra_info': 'xiba'," "};" "x = simplejson.dumps(json)", number=1000000))
另外需要補充一點是,如果你想直接 stmt 那里執行函數。可以把函數申明在當前文件中,然后在 stmt = ‘func()’ 執行函數。然后使用 setup = ‘from __main__ import func’ 即可,如果要import 多個需要使用 setup = from __main__ import func; import simplejson'
def test1(): n=0 for i in range(101): n+=i return n def test2(): return sum(range(101)) def test3(): return sum(x for x in range(101)) if __name__=='__main__': from timeit import Timer t1=Timer("test1()","from __main__ import test1") t2=Timer("test2()","from __main__ import test2") t3=Timer("test3()","from __main__ import test3") print(t1.timeit(10000)) print(t2.timeit(10000)) print(t3.timeit(10000)) print(t1.repeat(3,10000)) print(t2.repeat(3,10000)) print(t3.repeat(3,10000)) t4 = timeit.timeit(stmt=test1,setup="from __main__ import test1",number=10000) t5 = timeit.timeit(stmt=test2,setup="from __main__ import test2",number=10000) t6 = timeit.timeit(stmt=test3,setup="from __main__ import test3",number=10000) print(t4) #0.05130029071325269 print(t5) #0.015494466822610305 print(t6) #0.05650903115721077 print(timeit.repeat(stmt=test1,setup="from __main__ import test1",number=10000)) # [0.05308853391023148, 0.04544335904366706, 0.05969025402337652] print(timeit.repeat(stmt=test2,setup="from __main__ import test2",number=10000)) # [0.012824560678924846, 0.017111019558035345, 0.01429126826003152] print(timeit.repeat(stmt=test3,setup="from __main__ import test3",number=10000)) # [0.07385010910706968, 0.06244617606430164, 0.06273494371932059] #res: 0.043916918200588385 0.014892355541932578 0.05214884436618059 [0.04372713709398021, 0.04197132052492908, 0.04255431716177577] [0.014356804181737959, 0.012456603785177323, 0.012629659578433372] [0.0543709217115389, 0.05334180294099272, 0.05334931226535494]