Python 我怎样才能加快这个目录行走?

Python 我怎样才能加快这个目录行走?,python,os.walk,scandir,Python,Os.walk,Scandir,我试图编写一个函数,通过使用下面的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)

我试图编写一个函数,通过使用下面的
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)

如何加快速度?

一个建议是在dir\u names部分中替换dir\u name的

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\u names
仅包含子文件夹的目录,这是通过调用该函数产生的额外开销,因此它比原始代码慢得多


如果您使用的是python版本
=3.5
,那么
os.walk()
已经在引擎盖下调用了
os.scandir()
。正如Charles Duffy已经提到的,递归地单独调用
os.scandir()
很可能不会快很多。

os.scandir()
需要使用
os.walk()
来代替
os.walk()。另外,使用它意味着你要从操作系统中加载两次名称——一次是从操作系统中加载具有通常性能的
os.walk()
,另一次是从操作系统中加载
os.scandir()
@CharlesDuffy,据我所知,
os.scandir()
是对
os.listdir()
的替代,因此,它返回一个迭代器遍历目录的元素,但不是递归的。因此,如果替换
os.walk()
,它将只返回
home
-文件夹中的元素,而不返回子目录中的元素。对,因此您需要多次调用它,每个递归到的目录调用一次,就像
os.walk()
在引擎盖下所做的那样。然而,如果您的Python版本有一个
os.walk()
,它使用
scandir
,而不是
listdir
,它已经是现成的了,可能没有太多额外的空间。进行完整的目录扫描总是很慢——这就是为什么人们通常喜欢在可行的情况下使用
locate
而不是
find
。而
find
在幕后做了很多棘手的低级优化……如果
some_dir
最有可能出现的位置有限,我强烈建议编写知道这一点的代码,并在返回到更广泛的扫描之前对这些位置进行优先排序(如果不仅仅要求用户告诉您所需的资源在哪里,这并非闻所未闻或罕见)。你是对的,dir\u names中dir\u name的
是多余的,但是删除这一行并没有显示任何速度改进。那么我建议你阅读Charles的评论。例如,如果
'some\u dir'
目录仅位于
['Documents','Downloads','data'中的一个目录中
,那么只在它们上面运行
os.walk()
可能会快得多,而不是整个
home
文件夹。