我有一个动态生成正则表达式的应用程序代码 从一个配置进行一些解析。 当两种变化的时序性能,正则表达式的变化 正在捕获的正则表达式的每个部分都明显慢于 正常的正则表达式。 原因是regex模块内部某些操作的开销。
server unix:/home/axx/apps/axx/tmp/sockets/unicorn.axx.sock
问题:使用捕获组时,导致性能大幅下降的原因是什么?
答案 0 :(得分:19)
原因很简单,使用捕获组指示引擎将内容保存在内存中,而使用非捕获组则表示引擎不保存任何内容。请考虑您告诉引擎执行更多操作。
例如,使用此正则表达式(hello|bye|ola|cheers)
或(hello)|(bye)|(ola)|(cheers)
会比使用原子组或非捕获原则组((?:hello|bye|ola|cheers)
的影响大得多。
使用正则表达式时,您知道是否要捕获或不捕获上述情况的内容。如果您想捕获任何这些单词,您将失去性能,但如果您不需要捕获内容,那么您可以通过改进它来保存性能,就像使用非捕获组一样
我知道你标记了python,但已经为javascript编写了一个在线基准,以显示捕获和非捕获组如何影响js正则表达式引擎。
答案 1 :(得分:11)
您的模式仅在捕获组中有所不同。在正则表达式模式中定义捕获组并将模式与re.search
一起使用时,结果将是MatchObject
实例。每个匹配对象将包含尽可能多的组,因为模式中有捕获组,即使它们是空的。这是re
内部的开销:添加(列表)组(内存分配等)。请注意,群组还包含the starting and ending index of the text that they match等详细信息(请参阅MatchObject
reference)。