python中os.listdir后续调用的性能

1 投票
1 回答
577 浏览
提问于 2025-04-19 09:44

我在一台Windows电脑上对一个网络驱动器(NAS上的CIFS共享)进行大量的文件查找操作。

这个名为“Project”的文件夹里有1TB的数据,里面有15840个文件和1232个文件夹。

我使用的是glob模块,它会递归地调用os.listdir()来列出文件。

我在IDLE中加载了以下脚本,并多次点击“运行模块”。

import timeit
import glob

globPath = u'Z:/Project/*/*/*/*'

def native_glob():
    glob.glob(globPath))

print timeit.timeit(native_glob, number=1)

第一次运行:

>>> 64.4641505602

接下来的每次运行(大约0.5秒):

>>> 2.07747177124

(这个命令返回了4125个文件)

第一次运行的时间受网络负载影响很大,时间在100秒到40秒之间,但后续的每次运行大约都是2秒。

看起来背后有一个缓存机制在起作用。

  • 有没有人能复现这种情况?
  • 这是仅与Windows有关,还是和Python也有关系?

1 个回答

1

Python在调用os.listdir()的时候并不会进行任何缓存,这完全是因为Windows的原因。

任何网络目录的列出操作在被缓存之前都会很慢,远程网络共享驱动器上的文件夹列表也不例外。

撰写回答