moz*_*way 0 python regex optimization
尝试优化一些重用匹配组的代码,我想知道访问是否Match.group()昂贵。我试图挖掘re.py的源代码,但代码有点神秘。
一些测试似乎表明将 的输出存储在变量中可能更好Match.group(),但我想了解Match.group()调用时到底发生了什么,以及是否有另一种内部方法可以直接访问组的内容。
一些示例代码来说明潜在用途:
\nimport re\n\nm = re.search(\'X+\', f\'__{"X"*10000}__\')\n\n# do something\n# m.group()\n\n# do something else\n# m.group()\nRun Code Online (Sandbox Code Playgroud)\n直接访问:
\n%%timeit\nlen(m.group())\n220 ns \xc2\xb1 1.31 ns per loop (mean \xc2\xb1 std. dev. of 7 runs, 1000000 loops each)\nRun Code Online (Sandbox Code Playgroud)\n中间变量:
\nX = m.group()\nRun Code Online (Sandbox Code Playgroud)\n%%timeit\nlen(X)\n# 51 ns \xc2\xb1 0.172 ns per loop (mean \xc2\xb1 std. dev. of 7 runs, 10000000 loops each)\nRun Code Online (Sandbox Code Playgroud)\n参考文献:
\n当前的 re.py 代码(python 3.10)
\n当前的 sre_compile.py 代码(python 3.10)
消除属性访问的影响(没有太大变化)
\nG = m.group\n\n%%timeit\nlen(G())\n230 ns \xc2\xb1 1.12 ns per loop (mean \xc2\xb1 std. dev. of 7 runs, 1000000 loops each)\nRun Code Online (Sandbox Code Playgroud)\n
匹配对象保存对您搜索的原始字符串的引用,并索引每个组的开始和结束位置,包括组 0,即整个匹配的字符串。每次致电group()原始字符串进行切片以创建要返回的新字符串。
将返回值保存到变量可以避免每次都必须对字符串进行切片的时间和内存成本。(它还避免了重复方法调用的开销。)
您可以看到,这group()不仅仅是返回缓存的字符串,因为返回值并不总是相同的对象:
>>> import re
>>> x = re.search(r'sd', 'asdf')
>>> x.group() is x.group()
False
Run Code Online (Sandbox Code Playgroud)
如果你想查看 的实现group(),它match_group位于Modules/_sre.cPython 源代码中。
| 归档时间: |
|
| 查看次数: |
378 次 |
| 最近记录: |