Python如何检查列表中是否存在元素?

时间:2016-01-13 05:08:17

标签: python performance list

使用Python提供的标准语法来检查元素是否在列表中:

if someElement in someList:

这里实际执行的是什么? Python是否循环遍历每个索引并检查是否相等,还是实现了更复杂的东西?

我写的程序运行速度非常慢。没有数学正在执行,但它在很大程度上依赖于检查长列表中是否存在项目。有更快的解决方案吗?

已解决:检查元素是否在列表中与循环每个项目并检查是否相等。但是,检查集合中的项目要快得多,因为项目已经过哈希处理。

即使列表中的项目不可用(在我的情况下,其他列表),仍然值得将其转换为字符串,存储在集合中,并在需要时转换回来。起初,我认为这是笨重的,会降低性能。但是,它确实允许我的程序在几分钟内完成,而这需要几天时间。

不要低估检查套装中物品的速度。

3 个答案:

答案 0 :(得分:4)

是的,它循环遍历每个索引并检查是否相等。

此:

someElement in someList

相当于:

any( x == someElement for x in someList )

要加快速度,您可以使用set代替list,但这实际上取决于集合中元素的类型。

如果列表很大,查找可能会很慢。

答案 1 :(得分:2)

nc=set(someList)
if someElement in nc: #this will now be O(1) rather than O(n)

您可以从列表中进行设置并提高效果。

答案 2 :(得分:0)

是的,Python正在循环遍历每个索引。 in运算符调用__contains__()特殊方法(source)。

我想一个列表 - 假设CPython 2 - 它最终在listobject.c中的this list_contains code,在列表项上有一个简单的for循环:

list_contains(PyListObject *a, PyObject *el)
{
    Py_ssize_t i;
    int cmp;

    for (i = 0, cmp = 0 ; cmp == 0 && i < Py_SIZE(a); ++i)
        cmp = PyObject_RichCompareBool(el, PyList_GET_ITEM(a, i),
                                           Py_EQ);
    return cmp;
}
  

是否有更快速的解决方案?

使用更快查找的容器 - @vks建议一个集合,字典也很常见。两者都取决于您的数据是否可以hash(item)使用,或者它们无法正常工作。

但是对数据结构及其不同性能特征的研究对于答案来说太大了,特别是没有详细说明你的任务是什么,没有给定的代码和没有给定的性能。树结构也可以有更快的查找速度,但是如果你能找到一个,那么将工作卸载到用C编写的现有库是一个很好的Python策略。