创建新规则和使用"|"之间的正则表达式运行时差异,python



我正在使用 python3

我有一个规则:(re.compile(r'a b', re.IGNORECASE), "A"),后来我发现'a c'也应该是匹配。

添加此规则的效率更高?

(re.compile(r'a (b|c)', re.IGNORECASE), "A")

或简单地添加另一个规则

(re.compile(r'a c', re.IGNORECASE), "A").

我做了" Timeit",但没有显着差异。我想知道我的结论是对与否的,它背后的原因以及它适用于多案例,例如" A(b | c | d | e("和三个额外的规则。

没有一般答案,性能结果在很大程度上取决于所使用的正则发动机/风味。例如,已知Perl对Regex替代方案非常敏感,例如查看为什么添加另一种替代方案会使我的正则速度超过600倍?

python的RE模块不是最快的(完全不是(,但是,性能比较表明它受到正则替代方案的影响。

另一方面,似乎Python的RE性能遭受了更多的灾难性回溯。
例如,形式的形式x+的形式在将其写入xx*时性能更好。

通常,建议使用所有格量词,原子分组(请参见上面的链接(,并仅在必要时捕获以提高正则运行时。

因此,分别测试每个正则表达式通常比使用替代正则表达式要高得多。

作为正则表达式在线性时间匹配(W.R.T.与输入单词(,我相信拥有一个单个(更复杂(的正则表达式比许多不同的不同不同应该更有效(较小(。

快速测试:

import re 
import timeit
def create_simple_regex(lookup):
  return re.compile(lookup)
def create_complex_regex(lookups):
  return re.compile('|'.join(lookups))  
def look_with_simple(lookups, word):
  return [create_simple_regex(lookup).findall(word) for lookup in lookups]
def look_with_complex(lookups, word):
  return create_complex_regex(lookups).findall(word)
lookups = list('abcdefghijklmnopqrstuvwxyz')
word = 'hello world!' * 1000
print(timeit.timeit('look_with_simple(lookups, word)', number=1000, globals=globals()))
print(timeit.timeit('look_with_complex(lookups, word)', number=1000, globals=globals()))

这将导致(在在线替补中执行(:

1.62659708800129
5.003811294998741

所以看来我错了;-)

最新更新