<p>我发现你的问题很有趣,所以我做了一些测试。比较来自glob的<strong>原始结果,而不过滤不需要的子目录</strong>,并使用<strong>特定搜索功能搜索想要的结果</strong></p>
<p>似乎<strong>特定搜索的速度是<strong>的两倍左右,无需进一步处理即可得到所需的结果</p>
<p>我认为诀窍在于</p>
<p>1如果找到prj文件,立即停止循环</p>
<p>2在同一循环中同时搜索子目录和prj文件</p>
<pre><code>import os
import random
from pathlib import Path
import time
#
def make_sub_dirs(dir):
new_dir_paths = []
for i in range(4):
new_dir_path = os.path.join(dir, f'dir{i}')
os.makedirs(new_dir_path)
if random.randint(0, 3) == 1:
prj_file = os.path.join(new_dir_path, 'test.prj')
Path(prj_file).touch()
new_dir_paths.append(new_dir_path)
return new_dir_paths
#
def make_tree():
base_dir = [r'K:\test_tree']
if os.path.exists(base_dir[0]):
# already made
return
current_level_dir_paths = base_dir
for depth in range(3):
new_dir_paths = []
for dir in current_level_dir_paths:
new_dir_paths.extend(make_sub_dirs(dir))
current_level_dir_paths = new_dir_paths
#
def search_first_prj_dirs(search_dir_path):
dirs_found = []
dir_entries = os.listdir(search_dir_path)
for dir_entry in dir_entries:
dir_entry_path = os.path.join(search_dir_path, dir_entry)
if os.path.isfile(dir_entry_path):
if os.path.splitext(dir_entry)[-1] == '.prj':
# found !!!!!!
return [search_dir_path]
else:
# this should be a dir
dirs_found.append(dir_entry_path)
# no prj found, recurse into the found sub dirs
first_prj_dirs = []
for dir in dirs_found:
first_prj_dirs.extend(search_first_prj_dirs(dir))
return first_prj_dirs
#
make_tree()
start_time = time.time()
raw_glob_result = list(Path(r'K:\test_tree').rglob('*.prj'))
end_time = time.time()
print('raw glob', len(raw_glob_result), end_time - start_time)
start_time = time.time()
search_first_prj_dirs_result = search_first_prj_dirs(r'K:\test_tree')
end_time = time.time()
print('specific', len(search_first_prj_dirs_result), end_time - start_time)
print(' -')
raw_glob_result.sort()
for result in raw_glob_result:
print(result)
print(' -')
search_first_prj_dirs_result.sort()
for result in search_first_prj_dirs_result:
print(result)
</code></pre>
<p>结果</p>
<pre><code>raw glob 17 0.023003816604614258
specific 11 0.010011434555053711
- raw glob
K:\test_tree\dir0\dir0\dir0\test.prj
K:\test_tree\dir0\dir3\dir2\test.prj
K:\test_tree\dir1\dir0\dir2\test.prj
K:\test_tree\dir1\dir0\test.prj
K:\test_tree\dir1\dir2\dir1\test.prj
K:\test_tree\dir1\dir2\dir3\test.prj
K:\test_tree\dir1\dir3\dir0\test.prj
K:\test_tree\dir1\dir3\dir1\test.prj
K:\test_tree\dir1\dir3\test.prj
K:\test_tree\dir2\dir0\dir2\test.prj
K:\test_tree\dir2\dir1\dir1\test.prj
K:\test_tree\dir2\dir2\dir1\test.prj
K:\test_tree\dir2\dir3\dir2\test.prj
K:\test_tree\dir3\dir1\dir1\test.prj
K:\test_tree\dir3\dir2\dir3\test.prj
K:\test_tree\dir3\dir3\test.prj
K:\test_tree\dir3\test.prj
- specific
K:\test_tree\dir0\dir0\dir0
K:\test_tree\dir0\dir3\dir2
K:\test_tree\dir1\dir0
K:\test_tree\dir1\dir2\dir1
K:\test_tree\dir1\dir2\dir3
K:\test_tree\dir1\dir3
K:\test_tree\dir2\dir0\dir2
K:\test_tree\dir2\dir1\dir1
K:\test_tree\dir2\dir2\dir1
K:\test_tree\dir2\dir3\dir2
K:\test_tree\dir3
</code></pre>