与列表相比,字符串的 "in" 运算符的时间复杂度是否存在差异?
Is there a difference in time complexity of the "in" operator for strings compared to lists?
我想知道与使用 "in" 运算符在字符串中搜索子字符串相比,在列表中搜索字符串是否有任何好处。
我一直使用以下方法检查子字符串:
substr in str
但是我遇到了一段分割字符串然后执行检查的代码。
substr in str.split()
在性能方面或其他方面是否有任何好处,或者这只是该程序员的偏好。
谢谢!
它们做两种不同的事情。两者的复杂度都是 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
如前所述,可能略有不同:
>>> "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) 中的最佳情况(in 操作可能是用 C 的 strstr 编码);而 sub in str.split()
在开始查找单词之前仍然必须拆分整个文本(因此最好的情况总是至少 O(n),更多的内存消耗等)。
我想知道与使用 "in" 运算符在字符串中搜索子字符串相比,在列表中搜索字符串是否有任何好处。
我一直使用以下方法检查子字符串:
substr in str
但是我遇到了一段分割字符串然后执行检查的代码。
substr in str.split()
在性能方面或其他方面是否有任何好处,或者这只是该程序员的偏好。
谢谢!
它们做两种不同的事情。两者的复杂度都是 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
如前所述,可能略有不同:
>>> "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) 中的最佳情况(in 操作可能是用 C 的 strstr 编码);而 sub in str.split()
在开始查找单词之前仍然必须拆分整个文本(因此最好的情况总是至少 O(n),更多的内存消耗等)。