7

重複の可能性:
'has_key()' または 'in'?

keyPython では、 aが a にあるかどうかを判断する方法が 2 つありますdict

if dict.has_key(key)if key in dict

inキーワードが式をdictの反復にするため、2番目のものは最初のものよりも遅いと誰かが私に言ったのでhas_key、明らかにハッシュを使用して決定を下す代替よりも遅くなります。

私は違いを非常に疑っていますが、Python はina の前にあるキーワードdictを何らかのハッシュ方法に変換するのに十分賢いと思うので、これについての正式な主張を見つけることができません。

では、実際に両者の間に効率の違いはありますか?

ありがとう。

4

3 に答える 3

9

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

inキーワードは の呼び出しになり、dictdict.__contains__は好きなように実装できます。

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

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

于 2012-07-09T01:27:44.973 に答える
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
于 2012-07-09T01:32:51.697 に答える
3

has_key代替手段ではありません。非推奨です。使用しないでください。(とにかく遅い)

于 2012-07-09T01:37:29.523 に答える