当前位置:  开发笔记 > 编程语言 > 正文

在Python中缓存已编译的正则表达式对象?

如何解决《在Python中缓存已编译的正则表达式对象?》经验,为你挑选了1个好方法。

每次导入包含大量静态正则表达式的python文件时,都会花费cpu周期将字符串编译到内存中的代表状态机中.

a = re.compile("a.*b")
b = re.compile("c.*d")
...

问题:是否可以以预编译的方式将这些正则表达式存储在磁盘上的缓存中,以避免在每次导入时执行正则表达式编译?

腌制对象只需执行以下操作,无论如何都会导致编译:

>>> import pickle
>>> import re
>>> x = re.compile(".*")
>>> pickle.dumps(x)
"cre\n_compile\np0\n(S'.*'\np1\nI0\ntp2\nRp3\n."

re对象是unmarshallable:

>>> import marshal
>>> import re
>>> x = re.compile(".*")
>>> marshal.dumps(x)
Traceback (most recent call last):
  File "", line 1, in 
ValueError: unmarshallable object

John Milliki.. 13

是否可以以预编译的方式将这些正则表达式存储在磁盘上的缓存中,以避免在每次导入时执行正则表达式编译?

不容易.您必须编写一个挂钩到srePython正则表达式引擎的C 实现的自定义序列化程序.所需的时间和精力将大大超过任何性能优势.

首先,你有没有实际剖析代码?我怀疑编译正则表达式是应用程序运行时的重要部分.请记住,它们仅在第一次在当前执行中导入模块时进行编译 - 此后,模块及其属性将缓存在内存中.

如果你有一个基本上产生一次的程序,编译一堆正则表达式然后退出,你可以尝试重新设计它以在一次调用中执行多个测试.然后你可以重新使用正则表达式,如上所述.

最后,您可以将正则表达式编译为基于C的状态机,然后将它们与扩展模块链接.虽然这可能更难维护,但它将完全从您的应用程序中消除正则表达式编译.



1> John Milliki..:

是否可以以预编译的方式将这些正则表达式存储在磁盘上的缓存中,以避免在每次导入时执行正则表达式编译?

不容易.您必须编写一个挂钩到srePython正则表达式引擎的C 实现的自定义序列化程序.所需的时间和精力将大大超过任何性能优势.

首先,你有没有实际剖析代码?我怀疑编译正则表达式是应用程序运行时的重要部分.请记住,它们仅在第一次在当前执行中导入模块时进行编译 - 此后,模块及其属性将缓存在内存中.

如果你有一个基本上产生一次的程序,编译一堆正则表达式然后退出,你可以尝试重新设计它以在一次调用中执行多个测试.然后你可以重新使用正则表达式,如上所述.

最后,您可以将正则表达式编译为基于C的状态机,然后将它们与扩展模块链接.虽然这可能更难维护,但它将完全从您的应用程序中消除正则表达式编译.

推荐阅读
吻过彩虹的脸_378
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有