【问题标题】:why search for string in a larger string is much faster than in a list in python为什么在较大的字符串中搜索字符串比在 python 中的列表中搜索要快得多
【发布时间】:2021-10-24 21:35:44
【问题描述】:

我想知道,为什么在python中查找较大字符串中的特定字符串时,查找字符串比查找列表要快得多。

str_test = "some string words "*100
def search_in_string():
    if "with" in (str_test):
        return True
    
ls_test = ["some", "string" "words"]*100
def search_in_list():
    if "with" in (ls_test):
        return True

import timeit
print(timeit.timeit(search_in_string))
### 0.3497438999984297   

print(timeit.timeit(search_in_list))
### 2.4319190999995044

看起来在字符串中的搜索速度快了将近 7 倍

【问题讨论】:

  • 您的问题标题和问题正文不匹配。你的标题是问哪个更快,但正文断言子字符串搜索更快,并要求解释。你想问什么?
  • 第二个是遍历列表中的所有项目并比较每个项目的相等性(正如其他人所说,它基本上是嵌套的 for 循环 - 遍历该列表中的每个元素并逐个字符地比较它到i)。第一个是使用子字符串检查,它可以在线性方式(散列)中完成(并且可能已经完成)。

标签: python arrays string list search


【解决方案1】:

在 C 层翻录单个字符串很便宜。与许多对象执行丰富的比较(每个对象都必须通过自己的函数调用链来执行相等性检查)具有更高的开销。这根本不是大 O 的问题(如果 i 的长度在 list 的任何元素中都找不到,那么工作是 O(n) 用于 list 检查,就像优化的字符串一样搜索将是,因为所有单个字符串比较都可以根据长度检查立即返回 false 而无需读取其内容),只是 in list 检查必须查找并调用 __eq__ 40,000 次,而 in str 不会不。

当然,行为也不同; "foo" in "seafood is great" 将返回 True,而 "foo" in ["seafood", "is", "great"] 将返回 False。在实际代码中,如果必须多次执行此测试,并且您需要匹配整个单词,您通常只需在前面构造一个 set (O(n)) 并将每次检查 O(n) 问题减少到每次检查(大致)O(1) 问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-17
    • 2020-03-12
    • 2020-05-25
    • 2011-08-19
    • 1970-01-01
    • 2012-01-22
    • 1970-01-01
    • 2016-04-20
    相关资源
    最近更新 更多