加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

当循环超过100个不同的正则表达式时,Python re模块的速度降低了2

发布时间:2020-12-14 06:29:46 所属栏目:百科 来源:网络整理
导读:我的问题是解析日志文件,并删除每一行的可变部分,以便对它们进行分组.例如: s = re.sub(r'(?i)User [_0-9A-z]+ is ',r"User .. is ",s)s = re.sub(r'(?i)Message rejected because : (.*?) (.+)',r'Message rejected because : 1 (...)',s) 我有约120个
我的问题是解析日志文件,并删除每一行的可变部分,以便对它们进行分组.例如:
s = re.sub(r'(?i)User [_0-9A-z]+ is ',r"User .. is ",s)
s = re.sub(r'(?i)Message rejected because : (.*?) (.+)',r'Message rejected because : 1 (...)',s)

我有约120个匹配规则,如上所述.

在100次不同的正则表达式上连续搜索时,我没有发现性能问题.但是,当应用101正则表达式时,会发生巨大的减速.

当用我的规则替换时,会发生完全相同的行为

for a in range(100):
    s = re.sub(r'(?i)caught here'+str(a)+':.+',r'( ... )',s)

使用范围(101)时,速度要慢20倍.

# range(100)
% ./dashlog.py file.bz2
== Took  2.1 seconds.  ==

# range(101)
% ./dashlog.py file.bz2
== Took  47.6 seconds.  ==

为什么会发生这样的事情?
有没有什么已知的解决方法?

(在Linux / Windows上发生在Python 2.6.6 / 2.7.2上)

Python保留编译正则表达式的内部缓存.无论何时使用正则表达式的顶级函数之一,Python首先编译该表达式,并将该编译的结果缓存.

Guess how many items the cache can hold?

>>> import re
>>> re._MAXCACHE
100

当您超过缓存大小的那一刻,Python 2将清除所有缓存的表达式,并以干净的缓存开始. Python 3将限制增加到512,但仍然完全清楚.

解决方法是为您自己缓存编译:

compiled_expression = re.compile(r'(?i)User [_0-9A-z]+ is ')

compiled_expression.sub(r"User .. is ",s)

您可以使用functools.partial()将sub()调用与替换表达式捆绑在一起:

from functools import partial

compiled_expression = re.compile(r'(?i)User [_0-9A-z]+ is ')
ready_to_use_sub = partial(compiled_expression.sub,r"User .. is ")

然后稍后使用ready_to_use_sub(s)将编译的正则表达式模式与特定替换模式一起使用.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读