python 加速这个正则表达式子

标签 python regex

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/

相关文章:

regex - 在 unix 中用于 X 或 Y 的 grep?

python - Django:过滤日期之间的数据 | DatetimeField 收到一个简单的日期时间

python - Beautifulsoup 找不到标签

javascript - 如何向 Flask Server 发送数据?

php - Sphider 搜索引擎出现 "URLs must include"问题

python - 如何仅删除标点符号,如 "."和 ","?

python - 按条件从字符串中提取数字

python - 为 PyQt4.QtCore 导入 Hook

python - 我可以使用 python 装饰器根据输入类型预处理输入和后处理输出吗?

javascript - 使用正则表达式分别拆分 = 、 == 和 ===