【发布时间】:2012-09-12 21:50:09
【问题描述】:
来自re.compile() 的 Python 文档:
注意传递给的最新模式的编译版本 re.match()、re.search() 或 re.compile() 被缓存,所以程序 一次只使用几个正则表达式 不用担心 编译正则表达式。
但是,在我的测试中,这个断言似乎站不住脚。当重复使用相同模式的以下 sn-ps 计时时,编译后的版本仍然比未编译的版本快得多(应该被缓存)。
我在这里遗漏了什么来解释时差吗?
import timeit
setup = """
import re
pattern = "p.a.t.t.e.r.n"
target = "p1a2t3t4e5r6n"
r = re.compile(pattern)
"""
print "compiled:", \
min(timeit.Timer("r.search(target)", setup).repeat(3, 5000000))
print "uncompiled:", \
min(timeit.Timer("re.search(pattern, target)", setup).repeat(3, 5000000))
结果:
compiled: 2.26673030059
uncompiled: 6.15612802627
【问题讨论】:
-
请不要这样使用timeit。只需使用标准参数。即使结果有效,也很难判断方法是否合理。
-
抱歉,标准方法是什么样的?我基本上只是复制了this question。
-
不,你没有。那里的答案有运行一次的设置代码(在你的情况下,编译)和一个 single 语句。通过在
repeat(通常只是默认值,3和1000000)调用中指定较大的数字,或者使用循环足够长但不会太长的命令行界面(python -m timeit),循环留给定时自动长。from __main__ import ...技巧确实很有用。 -
@delnan 更新了,这是更好的方法吗? (注意在这种情况下结果是一样的,幸运的是我。)
-
是的,更好。现在讨论基准测试中的下一个潜在缺陷;)
标签: python regex performance python-2.7