python之timeit模塊


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]

  

 


免責聲明!

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



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