【发布时间】:2022-01-27 19:22:34
【问题描述】:
试图优化一些重用匹配组的代码,我想知道访问Match.group() 是否很昂贵。我试图挖掘re.py的源代码,但代码有点神秘。
一些测试似乎表明将Match.group() 的输出存储在变量中可能会更好,但我想了解调用Match.group() 时究竟发生了什么,以及是否有另一种内部方法可能直接访问组的内容。
一些示例代码来说明潜在用途:
import re
m = re.search('X+', f'__{"X"*10000}__')
# do something
# m.group()
# do something else
# m.group()
时间
直接访问:
%%timeit
len(m.group())
220 ns ± 1.31 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
中间变量:
X = m.group()
%%timeit
len(X)
# 51 ns ± 0.172 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
参考:
current re.py code (python 3.10)
current sre_compile.py code (python 3.10)
去掉属性访问的影响(变化不大)
G = m.group
%%timeit
len(G())
230 ns ± 1.12 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
【问题讨论】:
-
您确定这与
Match.group()直接相关,而不仅仅是Why is local variable access faster than class member access 的情况吗? -
另外,我没有彻底检查
re的代码,但如果group()是一个函数/方法,那么多次调用它的开销将超过仅仅调用一次。更好的测试是保存对它的引用 (x = match.group),然后对x()的调用计时。 -
@DeepSpace 不错的建议,我试过了,它并没有改变太多时间
标签: python regex optimization