gpt4 book ai didi

python 加速这个正则表达式子

转载 作者:太空狗 更新时间:2023-10-30 00:17:26 24 4
gpt4 key购买 nike

p = re.compile('>.*\n')
p.sub('', text)

我想删除所有以“>”开头的行。我有一个非常大的文件 (3GB),我以 250MB 大小的 block 处理,因此变量“文本”是一个大小为 250MB 的字符串。 (我尝试了不同的大小,但完整文件的性能始终相同)。

现在,我能以某种方式加速这个正则表达式吗?我尝试了多行匹配,但是速度慢了很多。或者有更好的方法吗?

(我已经尝试拆分字符串然后像这样过滤掉行,但它也更慢(我还尝试了 lambda 而不是 def del_line:(这可能不是工作代码,它只是来自内存):

def del_line(x): return x[0] != '>'

def func():
....
text = file.readlines(chunksize)
text = filter(del_line, text)
...

编辑:正如评论中所建议的那样,我也尝试逐行走:

text = []
for line in file:
if line[0] != '>':
text.append(line)
text = ''.join(text)

这也比较慢,需要大约 12 秒。我的正则表达式需要 ~7 秒。 (是的,这很快,但它也必须在较慢的机器上运行)

编辑:当然,我也试过 str.startswith('>'),它比较慢......

最佳答案

如果有机会,将 grep 作为子进程运行可能是最实用的选择。

如果出于某种原因您不能依赖 grep,您可以尝试实现一些使 grep 快速的“技巧”。从作者本人那里,您可以在这里阅读它们:http://lists.freebsd.org/pipermail/freebsd-current/2010-August/019310.html

在文章的最后,作者总结了要点。最让我印象深刻的是:

Moreover, GNU grep AVOIDS BREAKING THE INPUT INTO LINES. Looking for newlines would slow grep down by a factor of several times, because to find the newlines it would have to look at every byte!

我们的想法是将整个文件加载到内存中,并在字节级而不是行级对其进行迭代。只有当您找到匹配项时,您才会查找行边界并将其删除。

你说你必须在其他计算机上运行它。如果它在您的范围内并且您还没有这样做,请考虑在 PyPy 而不是 CPython(默认解释器)上运行它。这可能会(也可能不会)显着提高运行时间,具体取决于程序的性质。

此外,正如一些评论已经提到的,合理地说,使用实际的 grep 进行基准测试以获得您可以走多快的基准。如果您使用的是 Windows,请在 Cygwin 上获取它,这很简单。

关于python 加速这个正则表达式子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23574377/

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