「in」演算子を使用してリスト内の項目を検索する場合
if item in list:
print item
このアイテムの検索に使用されるアルゴリズム。リストを最初から最後まで真っ直ぐに検索しますか、それとも二分探索のようなものを使用しますか?
list
s はソートされた順序 (または任意の順序) であると想定できないため、二分探索は機能しません。また、キーがハッシュ可能であると想定することもできないため、dict
またはset
ハッシュ テーブル ルックアップとは異なり、検索を高速化するために使用することはできません。
推測では、最初から最後までのすべての要素の単純なチェックです。
関連する Python ソース コードを掘り下げてみます。
--
編集:演算子list.__contains__()
を実装する Python 関数は、 listobject.cで定義されています。in
393 static int
394 list_contains(PyListObject *a, PyObject *el)
395 {
396 Py_ssize_t i;
397 int cmp;
398
399 for (i = 0, cmp = 0 ; cmp == 0 && i < Py_SIZE(a); ++i)
400 cmp = PyObject_RichCompareBool(el, PyList_GET_ITEM(a, i),
401 Py_EQ);
402 return cmp;
403 }
最初の要素から最後の要素まで (または一致する要素が見つかるまで)、リスト内のすべての要素を反復処理します。ショートカットはありません。
--
編集 2: プロットが厚くなります。定数 list
またはの要素のメンバーシップをテストしていることを Python が検出した場合、次set
のようになります。
if letter in ['a','e','i','o','u']: # list version
if letter in {'a','e','i','o','u'}: # set version
編集 3 [@JohnMachin]:
定数リストは、2.5-2.7 および 3.1-3.3の定数タプルに最適化されています。
定数セットは、3.3 で (定数) 凍結セットに最適化されています。
@CoryCarsonの回答も参照してください。
がリテラル リストの場合list
、Python 3.2+ はより高速なアプローチを採用します: http://docs.python.org/dev/whatsnew/3.2.html#optimizations