python - 创建新规则和使用“|”之间的正则表达式运行时差异,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)'和三个额外规则。
解决方案
由于正则表达式在线性时间(输入单词)中匹配,我相信拥有一个(更复杂)正则表达式应该比许多不同(更小)的正则表达式更有效。
快速而肮脏的测试:
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()))
这导致(在在线 REPL 中执行):
1.62659708800129
5.003811294998741
所以看来我错了;-)
推荐阅读
- javascript - 根据导航栏加载特定幻灯片 (DIV) 并隐藏上一张幻灯片 (DIV)?
- python - 位置参数的命名元组类型错误计数
- c - 在继续之前等待串行写入完成
- batch-file - 移动文件的批处理脚本不起作用
- visual-studio - SQL Server Management Studio 17 问题 Visual Studio shell 隔离
- python - 子图问题:如何通过分类值为每个图绘制直方图?
- vue.js - vue-apollo 示例中 :link 的用法不清楚
- .net-core - 从 Windows 机器为 Linux 构建 Dotnet core 2.1 代码
- css - 在量角器中测试 CSS 选择器后的内容
- javascript - 在 React App 的 Active Directory 插件上出现 CORS 错误