微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我有一个目录,它有子目录,总共有 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 举报,一经查实,本站将立刻删除。