gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 20:55:12 35 4
gpt4 key购买 nike

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

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

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

pickling 对象只是执行以下操作,无论如何都会导致编译发生:

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

并且 re 对象是不可编码的:

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

最佳答案

Is it possible to store these regular expressions in a cache on disk in a pre-compiled manner to avoid having to execute the regex compilations on each import?

不容易。您必须编写一个自定义序列化程序,该序列化程序 Hook 到 Python 正则表达式引擎的 C sre 实现。所需的时间和精力远远超过任何性能优势。

首先,您是否真正分析过代码?我怀疑编译正则表达式是应用程序运行时的重要组成部分。请记住,它们仅在当前执行中第一次导入模块时编译 - 此后,模块及其属性被缓存在内存中。

如果您的程序基本上只生成一次,编译一堆正则表达式然后退出,您可以尝试重新设计它以在一次调用中执行多个测试。然后你可以像上面一样重复使用正则表达式。

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

关于python - 在 Python 中缓存已编译的正则表达式对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65266/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com