如果您使用的是 Windows,那么您将获得很多使用os.scandir()
(python 3.5+)或 backportscandir
模块:scandir.scandir()
这是因为在 Windows(与 Linux/Unix 相对)上,os.listdir()
已经在幕后执行了文件统计,但结果被丢弃,除了名称。这迫使您执行另一个stat
呼叫。
scandir
返回目录条目列表,而不是名称。在 windows 上,大小/对象类型字段已经被填充,因此当您stat
对条目执行 a 时(如下例所示),它的成本为零:
(取自https://www.python.org/dev/peps/pep-0471/)
def get_tree_size(path):
"""Return total size of files in given path and subdirs."""
total = 0
for entry in os.scandir(path):
if entry.is_dir(follow_symlinks=False):
total += get_tree_size(entry.path)
else:
total += entry.stat(follow_symlinks=False).st_size
return total
所以只需替换您的第一个os.listdir()
电话os.scandir()
,您就可以以与简单电话相同的成本获得所有信息os.listdir()
(这在 Windows 上是最有趣的,在 Linux 上则少得多。我在 Windows 上的慢速文件系统上使用过它,与我的情况相比,它os.listdir
获得了 8 倍的性能提升)os.path.isdir