栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

快速获取文件夹的总大小

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

快速获取文件夹的总大小

你处于不利地位。

Windows资源管理器几乎可以肯定地使用

FindFirstFile
/
FindNextFile
遍历目录结构
lpFindFileData
一次通过(通过)收集大小信息,从而使每个文件实质上是一个系统调用。

不幸的是,在这种情况下,Python不是您的朋友。从而,

  1. os.walk
    首次通话
    os.listdir
    (内部通话
    FindFirstFile
    /
    FindNextFile
    • 从此以后进行的任何其他系统调用只会使您 比Windows资源管理器
  2. os.walk
    然后调用
    isdir
    返回的每个文件
    os.listdir
    (在内部调用
    GetFileAttributesEx
    -或在Win2k之前调用
    GetFileAttributes
    +
    FindFirstFile
    组合)以重新确定是否递归
  3. os.walk
    os.listdir
    将执行 额外的内存分配 ,串和阵列操作等填写它们的返回值
  4. 然后
    getsize
    ,您需要 调用 返回的每个文件
    os.walk
    再次 调用
    GetFileAttributesEx

与Windows资源管理器相比,每个文件的系统调用多3倍,外加内存分配和操作开销。

您可以使用Anurag的解决方案,也可以尝试直接

FindFirstFile
/
FindNextFile
递归调用/
(应该与a
cygwin
或其他win32端口
的性能相当
du -s some_directory
)。

请参阅

os.py
的实施
os.walk
posixmodule.c
为实施
listdir
win32_stat
(双方调用
isdir
getsize
。)

请注意,

os.walk
在所有平台(Windows和 nices) ,Python 在所有版本
(包括Python3.1)以下
都是次优的 。在Windows和
nices上
os.walk
都可以通过遍历而无需调用,
isdir
因为
FindFirst
/
FindNext
(Windows)和
opendir
/
readdir

nix)已经通过
lpFindFileData->dwFileAttributes
(Windows)和
dirent::d_type

nix)返回了文件类型。

可能违反直觉,在大多数现代配置(例如Win7和NTFS,甚至某些SMB实现)

GetFileAttributesEx

其速度
FindFirstFile
是单个文件的 两倍 (可能比。遍历目录还要慢
FindNextFile
)。

更新: Python 3.5包括新的PEP 471

os.scandir()
函数,该函数通过返回文件属性和文件名来解决此问题。此新功能用于加快内置速度
os.walk()
(在Windows和Linux上)。您可以在PyPI上使用scandir模块来获得针对旧版Python版本(包括2.x)的此行为。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/639378.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号