查看字符串列表时更快的是什么?"在"或"索引"?

Bor*_*jaX 2 python string performance search list

我有一堆字符串列表,我需要知道一个字符串是否在其中任何一个所以我必须在第一个列表中找到字符串,如果没有找到,在第二个列表中,如果没有找到,则在第三个列表中查找. .. 等等.

我的问题是:什么更快?

if (string in stringList1):
    return True
else:
    if (string in stringList2):
        return True
    # ... #
Run Code Online (Sandbox Code Playgroud)

依此类推或在try/except块中使用index()函数?

try:
    return stringList1.index(string) >= 0
except:
    try:
        return stringList2.index(string) >= 0
    except:
       # ... #
Run Code Online (Sandbox Code Playgroud)

我知道"in"是线性的,通常python建议"比请求许可更好说抱歉"(意思是第二种方法会更好)但我想知道更合格的人的意见:)

谢谢!

Mik*_*ham 12

  1. in是确定某个容器中是否有东西的正确方法.在测试您的应用程序,发现它很慢,分析并找到导致它的原因之前,不要担心速度微优化.那时,通过测试进行优化(timeit模块可能对此有利),而不是通过互联网怪语.

    如果你正在进行大量的遏制检查,你可能想要使用set而不是序列; 集合有O(1)查找.如果这不适合您的问题,您可能需要使用列表和bisect模块,它仍然提供超过O(n)序列操作的算法性能优势.

  2. 有一个机会,你真正的意思if any(string in s for s in iterable_of_string_lists)还是if string in string_list_1 or string in string_list_2.嵌套ifs并不是像你展示的那样最好的方法.

  3. 从来没有使用裸露的except:.在这种情况下,始终捕获特定的异常except ValueError.使用except:将捕获并忽略您不想要的所有类型的异常,例如,KeyboardInterrupt如果用户试图退出您的应用程序,或者NameError如果您有输入错误.