【问题标题】:Python: speed for "in" vs regular expression [duplicate]Python:“in”与正则表达式的速度[重复]
【发布时间】:2013-11-11 16:42:59
【问题描述】:

在判断较大字符串中是否存在子字符串的实例时,

我正在考虑两种选择:

(1)

if "aaaa" in "bbbaaaaaabbb":
    dosomething()

(2)

pattern = re.compile("aaaa")
if pattern.search("bbbaaaaaabbb"):
    dosomething()

两者哪个更高效更快(考虑到字符串的大小很大)??

还有其他更快的选择吗?

谢谢

【问题讨论】:

标签: python string runtime


【解决方案1】:

正则表达式会更慢。

$ python -m timeit '"aaaa" in "bbbaaaaaabbb"'
10000000 loops, best of 3: 0.0767 usec per loop
$ python -m timeit -s 'import re; pattern = re.compile("aaaa")' 'pattern.search("bbbaaaaaabbb")'
1000000 loops, best of 3: 0.356 usec per loop

【讨论】:

    【解决方案2】:

    选项 (1) 肯定更快。对于未来,做这样的事情来测试它:

    >>> import time, re
    >>> if True:
    ...     s = time.time()
    ...     "aaaa" in "bbbaaaaaabbb"
    ...     print time.time()-s
    ... 
    True
    1.78813934326e-05
    
    >>> if True:
    ...     s = time.time()
    ...     pattern = re.compile("aaaa")
    ...     pattern.search("bbbaaaaaabbb")
    ...     print time.time()-s
    ... 
    <_sre.SRE_Match object at 0xb74a91e0>
    0.0143280029297
    

    gnibbler 的做法更好,我从来没有真正玩过解释器选项,所以我不知道那个。

    【讨论】:

    • 为什么是if True?为什么用time.time而不是timeit来计时一次迭代?
    • @delnan 不知道timeit,所以我用if 让它一次执行,因为我懒得创建文件...
    【解决方案3】:

    我碰巧手头有大肠杆菌基因组,所以我测试了这两个选项...在大肠杆菌基因组中寻找“AAAA”10,000,000 次(只是为了有合适的时间)使用选项 (1) 需要大约 3.7 秒。使用选项 (2),当然,pattern = re.compile("AAAA") 退出循环,大约需要 8.4 秒。 在我的例子中,“dosomething()”是将 1 添加到任意变量。 我使用的大肠杆菌基因组长 4639675 个核苷酸(字母)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      • 2010-09-12
      • 2011-08-06
      • 2016-04-22
      • 1970-01-01
      相关资源
      最近更新 更多