2012-07-09 9 views
6

可能性の重複:
'has_key()' or 'in'?効率差

Pythonでは、keydictであるかどうかを決定する2つの方法があります:

if dict.has_key(key)およびif key in dict

inキーワードを使用すると、最初のものより遅いので、has_keyよりも遅くなります。これは明らかにハッシュを使用して決定します。

私はPythonがinキーワードをdictの前に翻訳するほどスマートであると考えているため、これについての正式な主張は見つかりません。

本当に2つの効率の違いはありますか?

ありがとうございました。

答えて

8

これらの操作はどちらも同じことです:dictで実装されているハッシュテーブルをキーで調べます。どちらも辞書全体を反復しません。 for x in dictif x in dictと異なることに注意してください。どちらもキーワードinを使用しますが、操作は異なります。

キーワードはdict.__contains__で呼び出されますが、好きなように実装できます。

これらの操作のタイミングに違いがある場合は、非常に小さくなり、関数呼び出しオーバーヘッドhas_keyと関係があるでしょう。

ところで、一般的にはの方が、dict.has_key(key)よりも明確に表現されています。速度は好みとは無関係であることに注意してください。あなたがクリティカルパスにいることが分かっていない限り、読みやすさはスピードより重要です。

+2

....これだけでなく、 'has_key()'は廃止されており、もう使用しないでください。 :) – jonesy

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

これは「やや」ですか? –

+0

timeitが文を100万回実行し、その数が秒単位であることを考慮すると、絶対時間差はかなり小さいです。 – jterrace

+0

80ナノ秒のようなもの.. – jterrace

3

has_keyの代替ではありません。廃止予定です。それを使用しないでください。