我目前正在编写一个 Python 脚本来处理大约 10,000 个输入文档。根据脚本的进度输出,我注意到前 400 多个文档的处理速度非常快,然后脚本速度变慢,尽管所有输入文档的大小都大致相同。
我假设这可能与这样一个事实有关,即大部分文档处理都是使用正则表达式完成的,一旦它们被编译,我就不会将它们保存为正则表达式对象。相反,我会在需要时重新编译正则表达式。
因为我的脚本有大约 10 个不同的函数,所有函数都使用大约 10 - 20 个不同的正则表达式模式,我想知道在 Python 中有什么更有效的方法来避免一遍又一遍地重新编译正则表达式模式(在 Perl 中我可以简单地包含一个修饰符 //o
)。
我的假设是,如果我使用
将正则表达式对象存储在各个函数中pattern = re.compile()
生成的 regex 对象将不会被保留,直到下一次迭代的函数的下一次调用(每个函数被调用,但每个文档调用一次)。
创建预编译正则表达式的全局列表似乎没有吸引力,因为我需要将正则表达式列表存储在代码中与实际使用位置不同的位置。
关于如何巧妙有效地处理这个问题,有什么建议吗?
最佳答案
re 模块缓存已编译的正则表达式模式。缓存在达到 re._MAXCACHE 的大小时被清除,默认情况下为 100。(因为你有 10 个函数,每个函数有 10-20 个正则表达式(即 100-200 个正则表达式),你观察到的减速对于清除缓存。)
如果您不介意更改私有(private)变量,那么对您的程序进行快速而粗略的修复可能是将 re._MAXCACHE
设置为更高的值:
import re
re._MAXCACHE = 1000
关于定义多个正则表达式以在多次迭代中使用的 Pythonic 和高效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9914552/