Pythonic和有效的方法来定义多个正则表达式,以便在多次迭代中使用

Pat*_*Pat 7 python regex performance

我目前正在编写一个Python脚本来处理大约10,000个输入文档.基于脚本的进度输出,我注意到前400个文档的处理速度非常快,然后脚本速度变慢,尽管输入文档的大小大致相同.

我假设这可能与大多数文档处理都是使用正则表达式完成的事实有关,我们在编译后不会将它们保存为正则表达式对象.相反,我会在需要时重新编译正则表达式.

由于我的脚本有大约10个不同的函数,所有函数都使用了大约10 - 20个不同的正则表达式模式,我想知道在Python中有什么更有效的方法可以避免一遍又一遍地重新编译正则表达式模式(在Perl中我可以简单地包括修饰语//o).

我的假设是,如果我将正则表达式对象存储在各个函数中使用

pattern = re.compile()
Run Code Online (Sandbox Code Playgroud)

在下次迭代函数的下一次调用之前,不会保留生成的正则表达式对象(每个函数被调用但每个文档一次).

创建一个预编译正则表达式的全局列表似乎是一个没有吸引力的选项,因为我需要将代码列表存储在我的代码中的不同位置,而不是它们实际使用的位置.

关于如何整齐有效地处理这个问题的任何建议?

unu*_*tbu 10

re模块缓存已编译的正则表达式模式.当缓存达到re._MAXCACHE的大小时,缓存被清除,默认值为100.(由于你有10个函数,每个函数有10-20个正则表达式(即100-200个正则表达式),所以观察到的减速是有意义的缓存.)

如果您可以更改私有变量,那么对程序进行快速而脏的修复可能会设置re._MAXCACHE为更高的值:

import re
re._MAXCACHE = 1000
Run Code Online (Sandbox Code Playgroud)


Joh*_*hin 5

上次我看,re.compile维护了一个相当小的缓存,当它填满时,只是清空它.DIY没有限制:

class MyRECache(object):
    def __init__(self):
        self.cache = {}
    def compile(self, regex_string):
        if regex_string not in self.cache:
            self.cache[regex_string] = re.compile(regex_string)
        return self.cache[regex_string]
Run Code Online (Sandbox Code Playgroud)

  • 或者,更简洁,[源自`dict`并覆盖`__missing __()`](https://gist.github.com/2230130). (5认同)