python - 查看字符串列表时什么更快? "In"还是 "index"?

标签 python performance string search list

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

我的问题是:什么更快?

if (string in stringList1):
    return True
else:
    if (string in stringList2):
        return True
    # ... #

等等,或者在 try/except block 中使用 index() 函数?

try:
    return stringList1.index(string) >= 0
except:
    try:
        return stringList2.index(string) >= 0
    except:
       # ... #

我知道“in”是线性的,通常 python 的建议是“说抱歉比请求许可更好”(这意味着第二种方法会更好)但我想知道更有资格的人的意见: )

谢谢!

最佳答案

  1. in 是确定某物是否在容器中的正确方法。在测试您的应用程序之前,不要担心速度微优化,发现它很慢,profiled ,并找出是什么原因造成的。到那时,通过测试进行优化(timeit 模块可能对此有好处),而不是听信网络怪人的话。

    如果您要进行大量包含检查,您可能希望使用set 而不是序列;集合具有 O(1) 查找。如果这不适合您的问题,您可能需要使用列表和 bisect module ,它仍然提供优于 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: 将捕获并忽略您不希望出现的所有类型的异常,例如当用户尝试退出您的应用时出现的 KeyboardInterruptNameError 如果你有打字错误。

关于python - 查看字符串列表时什么更快? "In"还是 "index"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2922072/

相关文章:

c++ - 限制 std::string 变量的最大长度

python - 继承时更改文档字符串但保留方法相同

python - 给定分散的输入数据构建二维插值器

python - 在顺序读取的多个特征文件上训练 Keras 模型以节省内存

performance - CouchDB查询性能

c# - 当用 [] 中的数字赋值时,无法将类型字符串 [] 转换为字符串

python - BeautifulSoup 中的 .descendants 似乎没有按预期工作

c++ - pthread_mutex 锁是否比用户在代码中强加的内存屏障提供更高的性能

javascript - CSS/JS 动态缩小? (表现)

java - 解析包含引号和换行符的逗号分隔值