美文网首页
Python性能优化:增大正则表达式编译缓存

Python性能优化:增大正则表达式编译缓存

作者: simoncos | 来源:发表于2019-06-06 16:30 被阅读0次

关键词:正则表达式 | 缓存 | 性能优化

Python 3 的re库中,对正则表达式的编译函数re.compile()调用了私有函数re._compile(),但更根本上编译的计算是由sre_compile.compile()完成的,而re._compile()中对编译好的表达式进行了缓存,使用_MAXCACHE将缓存大小硬编码为512。以下是re._compile()的源码,摘自:https://github.com/python/cpython/blob/3.5/Lib/re.py (3.6,3.7里也没有变化)

_MAXCACHE = 512
def _compile(pattern, flags):
    # internal: compile pattern
    try:
        p, loc = _cache[type(pattern), pattern, flags]
        if loc is None or loc == _locale.setlocale(_locale.LC_CTYPE):
            return p
    except KeyError:
        pass
    if isinstance(pattern, _pattern_type):
        if flags:
            raise ValueError(
                "cannot process flags argument with a compiled pattern")
        return pattern
    if not sre_compile.isstring(pattern):
        raise TypeError("first argument must be string or compiled pattern")
    p = sre_compile.compile(pattern, flags)
    if not (flags & DEBUG):
        if len(_cache) >= _MAXCACHE:
            _cache.clear()
        if p.flags & LOCALE:
            if not _locale:
                return p
            loc = _locale.setlocale(_locale.LC_CTYPE)
        else:
            loc = None
        _cache[type(pattern), pattern, flags] = p, loc
    return p

在某些大规模应用场景下,512的缓存显然太小了一些,为了摆脱这个瓶颈但不去碰cpython的源码,我们可以自己改写re._compile(),从而实现自定义缓存大小(max_regex_cache),轻松排个10000出来。原函数里很多语句都不知道干嘛用的,但照葫芦画瓢总没错。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

""" RegexCompiler Class

Edited from python 3.5.4 re._compile() for regex caching.

"""

import sre_compile
import _locale
from pathlib import Path
import sys

p = Path(__file__).absolute()
sys.path.insert(0, str(p.parent.parent.parent))

from app_config import ALGO_CONFIG # ALGO_CONFIG['cache']['regex']里设置了缓存大小

class RegexCompiler(object):

    def __init__(self):
        # Enable the max cache size to cache all rules
        self.max_regex_cache = int(ALGO_CONFIG['cache']['regex'])
        # Other settings same as Python default RegexCompiler
        self.cache = {} # 缓存
        self.pattern_type = type(sre_compile.compile("", 0))
        self.DEBUG_FLAG = sre_compile.SRE_FLAG_DEBUG
        self.LOCALE_FLAG = sre_compile.SRE_FLAG_LOCALE

    def compile(self, pattern, flags=0):
        # internal: compile pattern
        try:
            p, loc = self.cache[type(pattern), pattern, flags]
            if loc is None or loc == _locale.setlocale(_locale.LC_CTYPE):
                return p
        except KeyError:
            pass
        if isinstance(pattern, self.pattern_type):
            if flags:
                raise ValueError(
                    "cannot process flags argument with a compiled pattern")
            return pattern
        if not sre_compile.isstring(pattern):
            raise TypeError("first argument must be string or compiled pattern")
        p = sre_compile.compile(pattern, flags)
        if not (flags & self.DEBUG_FLAG):
            if len(self.cache) >= self.max_regex_cache:
                self.cache.clear()
            if p.flags & self.LOCALE_FLAG:
                if not _locale:
                    return p
                loc = _locale.setlocale(_locale.LC_CTYPE)
            else:
                loc = None
            self.cache[type(pattern), pattern, flags] = p, loc
        return p

调用方法:

regex_compiler = RegexCompiler()
compiled = regex_compiler.compile(regex_str)

进一步优化是将这个类变成Singleton(之后我应该会专门写一篇),以及多模块共享

相关文章

  • Python性能优化:增大正则表达式编译缓存

    关键词:正则表达式 | 缓存 | 性能优化 Python 3 的re库中,对正则表达式的编译函数re.compil...

  • 简述http缓存

    简介 网站性能第一优化定律:优先考虑使用缓存优化性能。合理的使用缓存,对网站的性能优化的意义重大。以下对于缓存,都...

  • 常用的后端性能优化六种方式:缓存化+服务化+异步化等

    性能优化专题 前端性能优化 数据库性能优化 jvm和多线程优化 架构层面优化 缓存性能优化 常用的后端性能优化六大...

  • 架构解读

    高性能架构 关注点 性能指标,性能测试,性能优化 具体优化内容如概述所示 如何合理使用缓存 分布式缓存架构 采用...

  • Laravel性能优化整理

    Laravel性能优化 配置各种缓存

  • 网络优化

    网络性能排查工具 网络性能优化 应用程序优化 优化I/O模型 套接字 net.core.optmem_max增大每...

  • LLVM

    一、编译器 性能优化:启动优化、界面优化、架构优化 编译型语言:OC(编译器是clang)、C(编译器可以直接执行...

  • JMM造成指令重排的原因

    1、编译器优化 2、Processor 优化(流水线) 3、MESI缓存优化

  • jvm 相关阅读

    相关阅读 JVM性能优化1-JVM简介 JVM性能优化2-编译器 JVM性能优化3-垃圾回收 JVM性能优化4-C...

  • 性能优化/渲染原理/requestAnimationFrame/

    性能优化/渲染原理/requestAnimationFrame/缓存机制 1. 游览器基本渲染原理 性能优化是什么...

网友评论

      本文标题:Python性能优化:增大正则表达式编译缓存

      本文链接:https://www.haomeiwen.com/subject/lcmqxqtx.html