为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

绝地无双 2021-03-30 08:17:39
我的问题是关于解析日志文件并删除每行中的可变部分以便对其进行分组。例如: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)当使用range(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上。)
查看完整描述

1 回答

?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

Python为已编译的正则表达式保留内部缓存。每当您使用带有正则表达式的顶级函数之一时,Python都会首先编译该表达式,然后缓存该编译结果。


猜猜缓存可以容纳多少个项目?


>>> 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)时将已编译的正则表达式模式与特定的替换模式一起使用。


查看完整回答
反对 回复 2021-04-06
  • 1 回答
  • 0 关注
  • 192 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号