python - re.match vs re.search 性能差异

  显示原文与译文双语对照的内容
0 0

我试着比较 re.matchre.search使用 timeit模块是比我发现匹配搜索字符串的开头我想找到的字符串时。

>>> s1 = '''
... import re
... re.search(r'hello','helloab'*100000)
... '''
>>> timeit.timeit(stmt=s1,number=10000)
32.12064480781555
>>> s = '''
... import re
... re.match(r'hello','helloab'*100000)
... '''
>>> timeit.timeit(stmt=s,number=10000)
30.9136700630188

现在,我知道中查找pattern匹配字符串的开始位置并返回对象一经发现,但是不知是搜索如何操作。

将搜索执行任何额外匹配后的字符串的存在一开始使它变慢么?

UPDATE

之后使用@David Robinsons代码simlar我结果他。

>>> print timeit.timeit(stmt="r.match('hello')",
...              setup="import re; s = 'helloab'*100000; r = re.compile('hello')",
...              number = 10000000)
49.9567620754
>>> print timeit.timeit(stmt="r.search('hello')",
...              setup="import re; s = 'helloab'*100000; r = re.compile('hello')",
...             number = 10000000)
35.6694438457

所以,更新后的问题是为什么 search不在执行 match?

时间:原作者:7个回答

0 0

" " 是,更新的问题是为什么搜索或不执行匹配

在此特定示例中,其中一个字符串常量,而不是根据正则表达式,的确 re.search未声明的变量要比 re.match对于默认的其他incarnations中( I CPython实现还没有测试过这个Python ) 。

>>> print timeit.timeit(stmt="r.match(s)",
...              setup="import re; s = 'helloab'*100000; r = re.compile('hello')",
...              number = 10000000)
3.29107403755
>>> print timeit.timeit(stmt="r.search(s)",
...              setup="import re; s = 'helloab'*100000; r = re.compile('hello')",
...             number = 10000000)
2.39184308052

前瞻 C 代码后置这些模块,看来搜索代码内建了优化快速匹配模式带有前缀字符串横向 。 在上面的例子中,整个模式是一个字符串常量,无优化routined正则模式,因而这是用来匹配整个模式。

请注意这一次会降低其性能,并在文本字符串前缀越短,我们将介绍regex符号:

>>> print timeit.timeit(stmt="r.search(s)",
...              setup="import re; s = 'helloab'*100000; r = re.compile('hell.')",
...             number = 10000000)
3.20765399933
>>> 
>>> print timeit.timeit(stmt="r.search(s)",
...              setup="import re; s = 'helloab'*100000; r = re.compile('hel.o')",
...             number = 10000000)
3.31512498856
>>> print timeit.timeit(stmt="r.search(s)",
...              setup="import re; s = 'helloab'*100000; r = re.compile('he.lo')",
...             number = 10000000)
3.31983995438
>>> print timeit.timeit(stmt="r.search(s)",
...              setup="import re; s = 'helloab'*100000; r = re.compile('h.llo')",
...             number = 10000000)
3.39261603355

对于包含正则表达式模式部分的图案,SRE_MATCH 用于确定匹配项。 这本质上是一样的代码后置 re.match.

请注意这些结果与关闭( 使用 re.match稍快) 如根据正则表达式而不是文本字符串开头的模式。

>>> print timeit.timeit(stmt="r.match(s)",
...              setup="import re; s = 'helloab'*100000; r = re.compile('.ello')",
...              number = 10000000)
3.22782492638
>>> print timeit.timeit(stmt="r.search(s)",
...              setup="import re; s = 'helloab'*100000; r = re.compile('.ello')",
...             number = 10000000)
3.31773591042

换句话说,忽略这样一个事实: searchmatch有不同的目的, re.search命令要比 re.match只有在pattern是一个字符串常量。

当然,如果你使用的是文字字符串,因此你很可能不如使用字符串操作来代替。

>>> # Detecting exact matches
>>> print timeit.timeit(stmt="s == r", 
...              setup="s = 'helloab'*100000; r = 'hello'", 
...              number = 10000000)
0.339027881622
>>> # Determine if string contains another string
>>> print timeit.timeit(stmt="s in r", 
...              setup="s = 'helloab'*100000; r = 'hello'", 
...              number = 10000000)
0.479326963425
>>> # detecting prefix
>>> print timeit.timeit(stmt="s.startswith(r)",
...              setup="s = 'helloab'*100000; r = 'hello'",
...             number = 10000000)
1.49393510818
>>> print timeit.timeit(stmt="s[:len(r)] == r",
...              setup="s = 'helloab'*100000; r = 'hello'",
...             number = 10000000)
1.21005606651
原作者:
0 0

在我的机器上( Python 2 .7 .3 Mac OS上10 .7 .3,1 .7 GHz Intel Core i5 ),完成后把字符串结构,导入re,而regex在安装过程中编译并执行10000000次迭代,而不是10,我发现相反:

import timeit
print timeit.timeit(stmt="r.match(s)",
             setup="import re; s = 'helloab'*100000; r = re.compile('hello')",
             number = 10000000)
# 6.43165612221
print timeit.timeit(stmt="r.search(s)",
             setup="import re; s = 'helloab'*100000; r = re.compile('hello')",
            number = 10000000)
# 3.85176897049
原作者:
...