gpt4 book ai didi

python - 在 python 中递归搜索文件的最快方法是什么?

转载 作者:太空狗 更新时间:2023-10-29 22:17:38 25 4
gpt4 key购买 nike

我需要通过递归搜索生成一个文件列表,其路径包含特定字符串。我目前是这样做的:

for i in iglob(starting_directory+'/**/*', recursive=True):
if filemask in i.split('\\')[-1]: # ignore directories that contain the filemask
filelist.append(i)

这行得通,但在爬取大型目录树时,它的速度非常慢(约 10 分钟)。我们在 Windows 上,所以对 unix find 命令进行外部调用不是一种选择。我的理解是 glob 比 os.walk 快。

有没有更快的方法?

最佳答案

也许不是您希望得到的答案,但我认为这些时间安排很有用。在包含 15,424 个目录共计 102,799 个文件(其中 3059 个是 .py 文件)的目录上运行。

python 3.6:

import os
import glob

def walk():
pys = []
for p, d, f in os.walk('.'):
for file in f:
if file.endswith('.py'):
pys.append(file)
return pys

def iglob():
pys = []
for file in glob.iglob('**/*', recursive=True):
if file.endswith('.py'):
pys.append(file)
return pys

def iglob2():
pys = []
for file in glob.iglob('**/*.py', recursive=True):
pys.append(file)
return pys

# I also tried pathlib.Path.glob but it was slow and error prone, sadly

%timeit walk()
3.95 s ± 13 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%timeit iglob()
5.01 s ± 19.2 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%timeit iglob2()
4.36 s ± 34 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

在 cygwin (4.6.0-1) 上使用 GNU find (4.6.0)

编辑:下面是在 WINDOWS 上,在 LINUX 上我发现 find 快了大约 25%

$ time find . -name '*.py' > /dev/null

real 0m8.827s
user 0m1.482s
sys 0m7.284s

看起来 os.walk 和 Windows 上的一样好。

关于python - 在 python 中递归搜索文件的最快方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50948391/

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