python中os.listdir后续调用的性能
我在一台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的原因。
任何网络目录的列出操作在被缓存之前都会很慢,远程网络共享驱动器上的文件夹列表也不例外。