scandir:被 Python 3.5 纳入标准库的目录遍历加速方案
scandir:被 Python 3.5 纳入标准库的目录遍历加速方案
scandir 是一个 Python 目录遍历工具,核心价值在于提供比 os.walk() 更快的目录迭代方式,且使用接口完全一致。
速度提升的根源是一次系统调用的精简。Python 内置的 os.walk() 在遍历目录时,先调用 listdir() 获取文件列表,再对每个文件调用 stat() 判断是否为目录。遍历 N 个文件就需要约 2N 次系统调用。而操作系统在返回文件列表时已经携带了文件类型信息,scandir 利用这一点省去了多余的 stat 调用,将系统调用次数从约 2N 降至 N。

基准测试数据直观展示了优化幅度。在 Windows 7 上,scandir.walk() 比原生 os.walk() 快约 10 倍,NFS 文件系统上的提升可达 36 倍。Linux 和 macOS 的加速比在 3 到 10 倍之间。加速效果在大型目录上更显著,因为节省的系统调用数量随文件数线性增长。
scandir 的 API 设计强调兼容性。scandir.walk() 的接口与 os.walk() 完全一致,使用者无需学习新接口。新增的 scandir() 函数返回 DirEntry 对象迭代器,每个对象提供 name、path、is_dir()、is_file()、stat() 等属性和方法,且返回值已被缓存,避免重复系统调用。与 listdir() 不同的是,scandir() 返回生成器而非列表,处理超大目录时可降低内存占用。

2014 年 7 月,PEP 471 获得通过,scandir 被纳入 Python 3.5 标准库成为 os.scandir(),同时 os.walk() 也基于 scandir 重写获得了性能提升。从 Python 3.5 起,所有用户都自动受益于这项优化。对于仍使用 Python 2.7 或 3.4 的用户,可通过 pip install scandir 安装,并用 try/except 优雅降级。
scandir 被 Python 3.5 标准库吸收,先在第三方实现并验证,再通过 PEP 流程合入上游,这是 Python 生态中一条典型的贡献路径。项目虽已归档,但其影响仍在每天被数百万 Python 开发者使用。
数百万 Python 开发者使用。
更多推荐



所有评论(0)