【问题标题】:Comparing efficiency of two substring searching methods in Python比较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

标签: python


【解决方案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
    

    虽然这不能用简单的表达式来表达。

    【讨论】:

      猜你喜欢
      • 2011-10-21
      • 2015-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-09
      • 2012-12-18
      • 1970-01-01
      • 2019-03-27
      相关资源
      最近更新 更多