如何加快此目录的遍历速度?

问题描述 投票:0回答:1

我正在尝试编写一个函数,通过下面的

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)

如何加快速度?

python os.walk scandir
1个回答
1
投票

一个建议是替换

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()
很可能不会快很多。

© www.soinside.com 2019 - 2024. All rights reserved.