2012-07-09 27 views
6

可能重複:
'has_key()' or 'in'?效率差

在Python中,有是決定一個key是否在dict的兩種方法:

if dict.has_key(key) and if key in dict

有人告訴我,第二個比第一個更慢,因爲in關鍵字使得表達過字典的迭代器,所以它會比has_key另類,這顯然使用哈希做出決定慢。

由於我非常懷疑這種差異,因爲我認爲Python足夠聰明,可以將in關鍵字dict之前的關鍵字翻譯爲某種散列方式,所以我找不到任何關於此的正式聲明。

那麼,有沒有真正的任何兩者之間的效率差異?

謝謝。

回答

8

這些操作都做同樣的事情:檢查在字典的密鑰實現的哈希表。都不會遍歷整個字典。請記住,for x in dictif x in dict不同。他們都使用in關鍵字,但是是不同的操作。

in關鍵字成爲上dict.__contains__電話,這可快譯通但是實現它喜歡。

如果這些操作的時間不同,它將會非常小,並且將與has_key的函數調用開銷有關。

順便說一句,一般優先是key in dict作爲意圖比dict.has_key(key)更清晰的表達。請注意,速度與偏好無關。除非您知道您處於關鍵路徑,否則可讀性比速度更重要。

+2

....這一切,此外,「對象的has_key()」已經過時,不應再使用。 :) – jonesy 2012-07-09 02:28:52

3

D.has_key實際上是較慢由於函數調用:

>>> D = dict((x, y) for x, y in zip(range(1000000), range(1000000))) 
>>> from timeit import Timer 
>>> t = Timer("1700 in D", "from __main__ import D") 
>>> t.timeit() 
0.10631704330444336 
>>> t = Timer("D.has_key(1700)", "from __main__ import D") 
>>> t.timeit() 
0.18113207817077637 
+1

這是「略」? – 2012-07-09 03:21:59

+0

考慮到timeit運行語句一百萬次,並且數字是以秒爲單位,*絕對*時間差異非常小 – jterrace 2012-07-09 03:42:09

+0

類似於80納秒.. – jterrace 2012-07-09 03:44:49

3

has_key不是一種選擇。它已被棄用。不要使用它。 (這是無論如何要慢)