与列表相比,“ in”运算符在字符串上的时间复杂度是否有所不同?

时间:2019-10-12 18:57:23

标签: python string list time-complexity in-operator

我想知道与使用“ in”运算符搜索字符串中的子字符串相比,在列表中搜索字符串是否有任何好处。

我一直使用以下方法检查子字符串:

substr in str

但是我遇到了一段将字符串分割然后执行检查的代码。

substr in str.split()

在性能方面或其他方面是否有好处,或者这仅仅是该程序员的偏爱。

谢谢!

2 个答案:

答案 0 :(得分:4)

它们做两种不同的事情。两者的复杂度均为O(n),但这并不重要,因为您不会因为它们的速度而选择另一个。您将根据实际想要执行的操作做出选择。

>>> "o b" in "foo bar"  # "o b" is a substring of "foo bar"
True
>>> "o b" in "foo bar".split()  # "o b" is not an element of ["foo", "bar"]
False

答案 1 :(得分:1)

正如已经提到的,它可能略有不同:

>>> "Python" in "Monty Python's Flying Circus"
True
>>> "Python" in "Monty Python's Flying Circus".split()
False

从性能的角度来看,拆分要贵得多(它会创建一个临时列表):

>>> from timeit import timeit
>>> timeit("""'Monty' in "Monty Python's Flying Circus".split() """)
0.20677191999857314
>>> timeit("""'Monty' in "Monty Python's Flying Circus" """)
0.03346360499563161

我们还可能会争辩说,如果您要查找的单词在句子的开头附近,则sub in str将是O(1)中的最佳情况(操作中可能使用C的strstr);而sub in str.split()在开始寻找单词之前仍将必须拆分整个文本(因此,最佳情况总是至少为O(n),更多的内存消耗等)。