Noi*_*eet 6 python search glob
我需要通过递归搜索生成包含特定字符串的路径的文件列表.我这样做当前是这样的:
for i in iglob(starting_directory+'/**/*', recursive=True):
if filemask in i.split('\\')[-1]: # ignore directories that contain the filemask
filelist.append(i)
Run Code Online (Sandbox Code Playgroud)
这样可行,但是当抓取一个大型目录树时,它的速度非常慢(约10分钟).我们在Windows上,因此不能选择对unix find命令进行外部调用.我的理解是glob比os.walk更快.
有更快的方法吗?
FHT*_*ell 11
也许不是你希望的答案,但我认为这些时间是有用的.在一个包含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)
Run Code Online (Sandbox Code Playgroud)
在cygwin上使用GNU find(4.6.0)(4.6.0-1)
$ time find . -name '*.py' > /dev/null
real 0m8.827s
user 0m1.482s
sys 0m7.284s
Run Code Online (Sandbox Code Playgroud)
似乎就像os.walk你能得到的一样好.
| 归档时间: |
|
| 查看次数: |
4561 次 |
| 最近记录: |