去os.walk还是glob更快?

2024-06-17 11:15:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我在一个大硬盘上用python查找文件。我一直在看os.walk和glob。我通常使用os.walk,因为我发现它更整洁,而且似乎更快(对于通常大小的目录)。

有没有人对这两者都有经验,可以说哪个更有效?就像我说的,glob看起来比较慢,但是你可以使用通配符等,就像walk一样,你必须过滤结果。下面是查找核心转储的示例。

core = re.compile(r"core\.\d*")
for root, dirs, files in os.walk("/path/to/dir/")
    for file in files:
        if core.search(file):
            path = os.path.join(root,file)
            print "Deleting: " + path
            os.remove(path)

或者

for file in iglob("/path/to/dir/core.*")
    print "Deleting: " + file
    os.remove(file)

Tags: topathincoreforosdirroot
3条回答

您可以使用os.walk,但仍可以使用glob样式匹配。

for root, dirs, files in os.walk(DIRECTORY):
    for file in files:
        if glob.fnmatch.fnmatch(file, PATTERN):
            print file

不确定速度,但很明显,由于os.walk是递归的,所以它们会做不同的事情。

在测量/分析之前不要浪费时间进行优化。专注于使代码简单易维护。

例如,在您的代码中预编译RE,这不会提高您的速度,因为RE模块具有预编译REs的内部re._cache

  1. 保持简单
  2. 如果速度很慢,那么profile
  3. 一旦你知道什么是需要优化的,做一些调整并总是记录下来

注意,几年前进行的一些优化会使代码运行速度比“未优化”代码慢。这尤其适用于基于JIT的现代语言。

我研究了1000个目录中的一小部分网页缓存。任务是计算dirs中的文件总数。输出为:

os.listdir: 0.7268s, 1326786 files found
os.walk: 3.6592s, 1326787 files found
glob.glob: 2.0133s, 1326786 files found

如您所见,os.listdir是三个中最快的。对于这个任务,glog.glob仍然比os.walk快。

来源:

import os, time, glob

n, t = 0, time.time()
for i in range(1000):
    n += len(os.listdir("./%d" % i))
t = time.time() - t
print "os.listdir: %.4fs, %d files found" % (t, n)

n, t = 0, time.time()
for root, dirs, files in os.walk("./"):
    for file in files:
        n += 1
t = time.time() - t
print "os.walk: %.4fs, %d files found" % (t, n)

n, t = 0, time.time()
for i in range(1000):
    n += len(glob.glob("./%d/*" % i))
t = time.time() - t
print "glob.glob: %.4fs, %d files found" % (t, n)

相关问题 更多 >