比较Python中两个子字符串搜索方法的效率

时间:2014-02-16 21:21:47

标签: python

在python(link1link2)中搜索子字符串搜索主题后,我发现了两个明显的解决方案

str1 = 'Hi there'
str2 = 'Good bye'
# 1
if str1.find('Hi') != -1: 
    print 'Success!'
# 2
if 'Good' in str2:
    print 'Success'
  • 这两个生成的代码是否存在差异,或者第二个只是语法糖?
  • 一个或另一个更有效率吗?
  • 是否有第三个选项

2 个答案:

答案 0 :(得分:1)

可以检查这些条件的字节码是什么样的:

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

虽然这不能表达为简单的表达式

答案 1 :(得分:0)

第二个不仅仅是第一个语法糖。 str.find只是一种方法调用,而a in b调用a.__contains__(b)。我认为速度没有任何差异。

我会推荐第二个,因为它更像Pythonic:

它更具可读性。 它使用鸭子打字。字符串可以用不同的可迭代替换,它仍然可以工作。