Python:“in”与正则表达式的速度

时间:2013-11-11 16:42:59

标签: python string runtime

当确定子串的实例是否存在于更大的字符串中时,

我正在考虑两种选择:

(1)

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

(2)

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

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

还有其他更快的选择吗?

由于

3 个答案:

答案 0 :(得分:4)

正则表达式将会变慢。

$ 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

答案 1 :(得分:3)

选项(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这样做的方式更好,我从来没有真正玩过翻译选项,所以我不知道那个。

答案 2 :(得分:1)

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