必须注意:在进入这个兔子洞之前,请务必确保这是您的瓶颈。如果您只运行几次正则表达式,并且正则表达式不是特别复杂,那么节省的时间可能很少。
re.compile
如果您计划多次运行正则表达式操作,最好的选择是使用。但是,如果没有更多细节,最多只能说:你应该明确地测试。使用 timeit 或其他模块对过程进行计时。
至于缓存编译好的正则表达式,不管是否在后台缓存,直接使用re函数而不是先编译都会付出代价。要看到这一点,您应该使用dis
它来查看它的作用:
>>> def f():
... x="foo bar baz"
... return re.match("foo", x)
...
>>> dis.dis(f)
2 0 LOAD_CONST 1 ('foo bar baz')
3 STORE_FAST 0 (x)
3 6 LOAD_GLOBAL 0 (re)
9 LOAD_ATTR 1 (match)
12 LOAD_CONST 2 ('foo') ** always have to pass the regex
15 LOAD_FAST 0 (x)
18 CALL_FUNCTION 2
21 RETURN_VALUE
>>> n=re.compile("foo")
>>> def g():
... x="foo bar baz"
... return n.match("foo")
...
>>> dis.dis(g)
2 0 LOAD_CONST 1 ('foo bar baz')
3 STORE_FAST 0 (x)
3 6 LOAD_GLOBAL 0 (n)
9 LOAD_ATTR 1 (match)
12 LOAD_FAST 0 (x)
15 CALL_FUNCTION 1
18 RETURN_VALUE
因此,即使它确实在后台缓存了正则表达式,该计划也必须涉及将正则表达式传递给re.match
(这是不可避免的)。编译后的版本避免了这一步。