【发布时间】:2010-10-27 20:21:14
【问题描述】:
我有一个包含 300 多个正则表达式的 Python 控制台应用程序。每个版本的正则表达式集都是固定的。当用户运行应用程序时,整套正则表达式将被应用到任何地方,从一次(一个非常短的工作)到数千次(一个很长的工作)。
我想通过预先编译正则表达式来加速较短的作业,将编译后的正则表达式腌制到一个文件中,然后在应用程序运行时加载该文件。
python re 模块是高效的,正则表达式的编译开销对于长时间的工作来说是完全可以接受的。然而,对于短作业,它占整个运行时间的很大一部分。一些用户会希望运行许多小型作业以适应他们现有的工作流程。编译正则表达式大约需要 80 毫秒。一个简短的工作可能需要 20 毫秒到 100 毫秒,不包括正则表达式编译。因此,对于短期工作,开销可能是 100% 或更多。这适用于 Windows 和 Linux 下的 Python27。
正则表达式必须与 DOTALL 标志一起应用,因此需要在使用前进行编译。在这种情况下,大型编译缓存显然无济于事。正如一些人所指出的,序列化编译的正则表达式的默认方法实际上并没有多大作用。
re 和 sre 模块将模式编译成带有自己的操作码和一些辅助数据结构(例如,用于表达式中的字符集)的小型自定义语言。 re.py 中的 pickle 函数采取了简单的方法。它是:
def _pickle(p):
return _compile, (p.pattern, p.flags)
copy_reg.pickle(_pattern_type, _pickle, _compile)
我认为该问题的一个好的解决方案是更新 re.py 中 _pickle 的定义,它实际上腌制了已编译的模式对象。不幸的是,这超出了我的 Python 技能。不过,我敢打赌,这里有人知道怎么做。
我意识到我不是第一个提出这个问题的人 - 但也许你可以成为第一个给出准确而有用的回答的人!
您的建议将不胜感激。
【问题讨论】:
-
有了这么多正则表达式,考虑将 re._MAXCACHE 从其默认值 100 提高。
-
@user489276:您实际上并没有问问题。您实际上并没有提供太多有用的信息。这里有一些问题要问你:在什么平台上的什么版本的 Python 上编译你的 300 多个正则表达式需要多长时间?作业中是否使用了所有 300 多个正则表达式?
-
“如何在 python 中腌制已编译的正则表达式”缺少标点符号,但仍可识别为问题。
-
如果每个版本的集合都是固定的,并且正则表达式花费了不可接受的时间,那么我会用适当的解析器替换它们。
-
在目前的状态下,这是一个很好的第一个问题。欢迎加入社区,我们希望你能坚持下去。