比较Python中两种子字符串搜索方法的效率
Posted
技术标签:
【中文标题】比较Python中两种子字符串搜索方法的效率【英文标题】:Comparing efficiency of two substring searching methods in Python 【发布时间】:2014-03-16 00:36:04 【问题描述】:在python中搜索子串搜索的话题(link1,link2)后发现了两个明显的解决方案
str1 = 'Hi there'
str2 = 'Good bye'
# 1
if str1.find('Hi') != -1:
print 'Success!'
# 2
if 'Good' in str2:
print 'Success'
这两个生成的代码有区别还是第二个只是语法糖?
哪一种更有效?
是否有第三种选择
【问题讨论】:
就复杂性而言,它们都是O(n)
使用对给定场景有意义的那个...如果您想获得索引,请使用find
...如果您想测试会员使用in
【参考方案1】:
第二个不仅仅是第一个的语法糖。 str.find
只是一个方法调用,而a in b
调用a.__contains__(b)
。我认为速度没有任何差异。
我会推荐第二个,因为它更 Pythonic:
它更具可读性。 它使用鸭子打字。该字符串可以用不同的迭代器替换,它仍然可以工作。
【讨论】:
【参考方案2】:您可以检查这些条件下字节码的样子:
In [1]: import dis
In [2]: dis.dis(lambda: 'Hi' in x)
1 0 LOAD_CONST 1 ('Hi')
3 LOAD_GLOBAL 0 (x)
6 COMPARE_OP 6 (in)
9 RETURN_VALUE
In [3]: dis.dis(lambda: x.find('Hi') != -1)
1 0 LOAD_GLOBAL 0 (x)
3 LOAD_ATTR 1 (find)
6 LOAD_CONST 1 ('Hi')
9 CALL_FUNCTION 1 (1 positional, 0 keyword pair)
12 LOAD_CONST 3 (-1)
15 COMPARE_OP 3 (!=)
18 RETURN_VALUE
正如您所见,find
版本的功能更多,特别是它正在执行 in
运算符不需要的属性查找。
我还必须说in
更明确地表明您正在检查子字符串的存在而不是其位置,因此它更具可读性。
就速度而言,对于任何合理大小的字符串,它们应该完全相等。仅对于最小的字符串,属性查找具有显着影响,但在这种情况下,无论如何都会非常快速地检查条件。
第三个选项是使用index
并捕获异常:
try:
string.index(substring)
except IndexError:
# not found
else:
# found
虽然这不能用简单的表达式来表达。
【讨论】:
以上是关于比较Python中两种子字符串搜索方法的效率的主要内容,如果未能解决你的问题,请参考以下文章