我正在尝试编写一个函数,通过下面的
os.walk()
遍历目录树来查找目录。在我的机器上,这需要 15 秒。
for dir_path, dir_names, filenames in os.walk(os.path.expanduser('~')):
for dir_name in dir_names:
if dir_name == 'some_dir':
path = os.path.join(dir_path, dir_name)
print(path)
我读到
os.scandir()
更快,所以我在下面尝试了这个,尽管我认为实现是错误的。它可以工作,但现在已经快 30 秒了。
for dir_path, dir_names, filenames in os.walk(os.path.expanduser('~')):
with os.scandir(dir_path) as entries:
for entry in entries:
if entry.name.endswith('some_dir') and entry.is_dir():
print(entry.path)
如何加快速度?
一个建议是替换
for dir_name in dir_names
部分:
for dir_path, dir_names, filenames in os.walk(os.path.expanduser('~')):
if 'some_dir' in dir_names:
path = os.path.join(dir_path, 'some_dir')
print(path)
我不知道你是否有很多子目录,但根据这一点,这应该已经使代码更快了。
另外,我建议注释掉
当您需要文件类型的附加信息时,
os.scandir()
函数优于os.listdir
,但由于dir_names
仅包含子文件夹的目录,这是调用该函数产生的额外开销,因此它是比原始代码慢很多。
如果您使用Python版本
>=3.5
,那么os.walk()
已经在后台调用了os.scandir()
。正如 Charles Duffy 已经提到的,单独递归调用 os.scandir()
很可能不会快很多。