我正在使用 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
所以看来我错了;-)