使用Python提供的标准语法来检查元素是否在列表中:
if someElement in someList:
这里实际执行的是什么? Python是否循环遍历每个索引并检查是否相等,还是实现了更复杂的东西?
我写的程序运行速度非常慢。没有数学正在执行,但它在很大程度上依赖于检查长列表中是否存在项目。有更快的解决方案吗?
已解决:检查元素是否在列表中与循环每个项目并检查是否相等。但是,检查集合中的项目要快得多,因为项目已经过哈希处理。
即使列表中的项目不可用(在我的情况下,其他列表),仍然值得将其转换为字符串,存储在集合中,并在需要时转换回来。起初,我认为这是笨重的,会降低性能。但是,它确实允许我的程序在几分钟内完成,而这需要几天时间。
不要低估检查套装中物品的速度。
答案 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策略。