在目录及其子目录中查找与正则表达式模式匹配的所有字符串的最快方法是什么?

问题描述

我有一个目录,它有子目录,总共有 63511 个文件。其中一个文件包含字符串 sdushantha。我的目标是通过遍历目录和子目录中的每个文件,找到找到该文件的最快方法

花了一些时间后,我想出了这个 Python 代码,它使用 os.walk() 遍历目录树。

import os
import re

regex = re.compile(r"sdushantha")

for path,_,files in os.walk("myfolder"):
    for file in files:
        filepath = os.path.join(path,file)
        try:
            with open(filepath) as f:
                for line_number,line in enumerate(f):
                    results = re.findall(regex,line)

                    if len(results) != 0:
                        print(f"{filepath} --> {results}")
        
        # We get an UnicodeDecodeError when reading binary files
        except UnicodeDecodeError:
            pass

这是使用上面的 Python 代码找到字符串 sdushantha 所花费的时间。

$ time python3 search.py 
myfolder/path/to/this/testfile --> ['sdushantha']
python3 search.py  55.40s user 16.80s system 49% cpu 2:26.91 total

我知道我可以使用 greprg (ripgrep) 来实现 Python 代码功能

$ time rg sdushantha myfolder
myfolder/path/to/this/testfile
1:sdushantha
rg sdushantha myfolder  1.41s user 8.48s system 178% cpu 5.551 total

$ time grep -r sdushantha myfolder
myfolder/path/to/this/testfile
grep -r sdushantha myfolder  0.92s user 4.89s system 45% cpu 12.862 total

从时间结果可以看出,rg 是禁食的(5.551 秒),而我的 Python 脚本是最慢的(2:26.91)。这可能是因为 rg 是用 Rust 编写的,比 Python 快得多。

我知道我可以使用 subprocess 在我的 Python 代码中运行 rggrep,但我正在寻找一种无需依赖即可加快进程的方法外部命令。

谢谢:)

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)