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

儿子

我的问题是解析日志文件并删除每行中的可变部分以便对其进行分组。例如:

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上。)

马丁·彼得斯(Martijn Pieters)

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

插入USB热点后,简单Java程序的速度降低了100倍

来自分类Dev

使用IN运算符的SQL查询停止查找索引并开始对其进行扫描,速度降低了100倍

来自分类Dev

re.sub 上的 Python 正则表达式额外字符(正则表达式替换)

来自分类Dev

正则表达式匹配时,Python的Re.Sub不变

来自分类Dev

带python请求模块的多行正则表达式

来自分类Dev

python re.findall()中的正则表达式

来自分类Dev

Python re.search正则表达式匹配

来自分类Dev

使用python re简化正则表达式

来自分类Dev

选择哪个python re模块来翻译perl正则表达式

来自分类Dev

正则表达式用python和re模块按方括号和圆点分隔

来自分类Dev

Python正则表达式:re.search()在大型文本文件上非常慢

来自分类Dev

将标志作为位置参数传递给re.sub时,Python正则表达式不起作用

来自分类Dev

Python正则表达式re.findall-将字符串拆分为两个

来自分类Dev

GCC 和 LLVM 中正则表达式的速度相差 1000 倍

来自分类Dev

正则表达式。20个字母,最多2个(。-_)

来自分类Dev

如何找到第 20 个正则表达式匹配组?

来自分类Dev

将网址的最后一个目录与RE2正则表达式匹配

来自分类Dev

C / Java中的正则表达式处理速度比Python中的快多少?

来自分类Dev

MongoDB使用正则表达式发现速度很慢

来自分类Dev

带有python请求模块的多行正则表达式

来自分类Dev

Python的正则表达式模块:重复“反向引用”似乎无法正常工作

来自分类Dev

安装Python的新正则表达式模块不起作用

来自分类Dev

python代码内部直接读取文件并应用模块正则表达式

来自分类Dev

正则表达式以匹配模块中的所有Python定义

来自分类Dev

Python正则表达式模块模糊匹配:替换计数不符合预期

来自分类Dev

在子进程python模块中使用egrep正则表达式

来自分类Dev

为什么在AWS实例上Python正则表达式比具有类似规格的本地Mac OS X慢5倍?

来自分类Dev

为什么在AWS实例上Python正则表达式比具有类似规格的本地Mac OS X慢5倍?

来自分类Dev

Ansible:在模块“ copy”中使用正则表达式

Related 相关文章

  1. 1

    插入USB热点后,简单Java程序的速度降低了100倍

  2. 2

    使用IN运算符的SQL查询停止查找索引并开始对其进行扫描,速度降低了100倍

  3. 3

    re.sub 上的 Python 正则表达式额外字符(正则表达式替换)

  4. 4

    正则表达式匹配时,Python的Re.Sub不变

  5. 5

    带python请求模块的多行正则表达式

  6. 6

    python re.findall()中的正则表达式

  7. 7

    Python re.search正则表达式匹配

  8. 8

    使用python re简化正则表达式

  9. 9

    选择哪个python re模块来翻译perl正则表达式

  10. 10

    正则表达式用python和re模块按方括号和圆点分隔

  11. 11

    Python正则表达式:re.search()在大型文本文件上非常慢

  12. 12

    将标志作为位置参数传递给re.sub时,Python正则表达式不起作用

  13. 13

    Python正则表达式re.findall-将字符串拆分为两个

  14. 14

    GCC 和 LLVM 中正则表达式的速度相差 1000 倍

  15. 15

    正则表达式。20个字母,最多2个(。-_)

  16. 16

    如何找到第 20 个正则表达式匹配组?

  17. 17

    将网址的最后一个目录与RE2正则表达式匹配

  18. 18

    C / Java中的正则表达式处理速度比Python中的快多少?

  19. 19

    MongoDB使用正则表达式发现速度很慢

  20. 20

    带有python请求模块的多行正则表达式

  21. 21

    Python的正则表达式模块:重复“反向引用”似乎无法正常工作

  22. 22

    安装Python的新正则表达式模块不起作用

  23. 23

    python代码内部直接读取文件并应用模块正则表达式

  24. 24

    正则表达式以匹配模块中的所有Python定义

  25. 25

    Python正则表达式模块模糊匹配:替换计数不符合预期

  26. 26

    在子进程python模块中使用egrep正则表达式

  27. 27

    为什么在AWS实例上Python正则表达式比具有类似规格的本地Mac OS X慢5倍?

  28. 28

    为什么在AWS实例上Python正则表达式比具有类似规格的本地Mac OS X慢5倍?

  29. 29

    Ansible:在模块“ copy”中使用正则表达式

热门标签

归档