在python中使用in运算符搜索列表时使用了什么算法?

What algorithm is used when using the in operator in python to search a list?

(P)When using the'in'operator to search for an item in a list e.g.(p)字母名称(P)什么算法是用来搜索这个项目。是从开始到结束,还是从开始使用像二进制搜索一样的东西?(p)


不能假定list是按排序顺序(或任何顺序)进行的,因此二进制搜索无法工作。也不能假定密钥是可散列的,因此与dictset不同,不能使用散列表查找来加速搜索。

大概是对每个元素从头到尾的直接检查。

我将尝试挖掘相关的Python源代码。

——

编辑:在listObject.c中定义了实现in运算符的python list.__contains__()函数:

1
2
3
4
5
6
7
8
9
10
11
   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:绘图变厚。如果python检测到您正在测试常量listset中元素的成员身份,例如:

1
2
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's answer。


如果list是文本列表,python 3.2+将采用更快的方法:http://docs.python.org/dev/whatsnew/3.2.html优化