web-dev-qa-db-ja.com

Pythonの 'in'はどれくらい効率的/高速ですか? (時間の複雑さに関して)

Pythonでは、次のようなinキーワードの効率はどうですか。

a = [1, 2, 3]
if 4 in a:
  ...
38
John

右手に依存します オペランド

演算子inおよび_not in_は、コレクションのメンバーシップをテストします。 [...]従来、コレクションメンバーシップテストはシーケンスにバインドされていました。コレクションがシーケンスであり、そのオブジェクトに等しい要素を含む場合、オブジェクトはコレクションのメンバーです。ただし、他の多くのオブジェクトタイプでは、シーケンスにならずにメンバーシップテストをサポートすることは理にかなっています。特に、辞書(キー用)およびセットはメンバーシップテストをサポートしています。

クラスは 特別なメソッド___contains___ を実装してデフォルトの動作をオーバーライドし(シーケンスを反復)、したがって、容器。

メンバーシップテスト演算子(inおよび_not in_)は通常、シーケンスの反復として実装されます。ただし、コンテナオブジェクトは、より効率的な実装で次の特別なメソッドを提供できます。これにより、オブジェクトをシーケンスにする必要もなくなります。


例にはリストがあるため、リストが繰り返され、一致が見つかるかリストがなくなるまで各要素が比較されます。時間の複雑さは通常O(n)です。

40
Felix Kling

リストの複雑さは次のとおりです。

O(n)

セットの場合:

O(1)

http://wiki.python.org/moin/TimeComplexity

53
Eduardo