2016-09-18 27 views
0

嘗試評估in語句的性能:setlist。我知道我可以用模塊time來做,但我想嘗試timeit模塊。 所以我的代碼是未來:通過timeit模塊對列表進行評估的奇怪結果

from timeit import Timer 


def func_to_test(val, s): 
    return val in s 

if __name__ == "__main__": 
    val = 346 
    n = 100000 
    s = set([x for x in range(n)]) 
    l = [x for x in range(n)] 
    list_timer = Timer("func_to_test(%s, %s)" % (val, l), "from __main__ import func_to_test") 
    set_timer = Timer("func_to_test(%s, %s)" % (val, s), "from __main__ import func_to_test") 
    print(list_timer.timeit(100)) 
    print(set_timer.timeit(100)) 

輸出是:

0.1953735960000813 
0.6675883569996586 

但爲什麼in語句list 「有」 比set更好的性能? 我知道這不是,但爲什麼有timeit模塊的這些結果?

+0

嘗試使用更大的N,在這種情況下,設定恆定因素可能只是有點高,所以不會比l對於增長較慢小號n – Natecat

回答

2

您的設置語句導入func_to_test,但它不會執行任何操作。因此,實際的時間測試不僅要計算成員資格測試所需的時間,還要計算創建列表(用於列表測試)或列表一組(用於設置測試)所需的時間。在建立語句創建迭代,這個問題消失:

>>> import timeit 
>>> timeit.timeit('346 in s', setup='s=list(range(100000))') 
9.412489017458922 
>>> timeit.timeit('346 in s', setup='s=set(list(range(100000)))') 
0.08872845571155352 
>>> timeit.timeit('346 in s', setup='s=set(range(100000))') 
0.09335872296618675 
+0

謝謝,你指出正確的時間。但爲什麼我的代碼產生這樣的結果? – Litwisha

+0

@Litwisha - 因爲您的代碼正在查看創建列表和測試成員資格需要多長時間,或者創建列表,創建一個集合並測試成員資格,而不僅僅是測試成員資格需要多長時間。 – TigerhawkT3

+0

這對我來說有點陌生。因爲列表和集創建正在主塊中進行評估,而不是在'func_to_test'中。 – Litwisha