更快到os.walk还是glob?

jdb*_*org 29 python glob traversal os.walk directory-walk

我在大型硬盘上乱码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)
Run Code Online (Sandbox Code Playgroud)

要么

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

a5k*_*kin 28

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

os.listdir: 0.7268s, 1326786 files found
os.walk: 3.6592s, 1326787 files found
glob.glob: 2.0133s, 1326786 files found
Run Code Online (Sandbox Code Playgroud)

如你所见,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)
Run Code Online (Sandbox Code Playgroud)

  • 这不会以递归方式运行文件树. (5认同)
  • 不是`os.walk`懒惰(生成器)而``glob`会在内存中创建一个大的列表吗? (2认同)
  • `glob.iglob` 将返回一个生成器,python 2 https://docs.python.org/2/library/glob.html#glob.iglob,python 3 https://docs.python.org/3/library/ glob.html#glob.iglob (2认同)

Mic*_*jer 10

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

例如,在您的代码中,您预编译RE,它不会为您提供任何速度提升,因为re模块具有内部re._cache预编译的RE.

  1. 把事情简单化
  2. 如果它很慢,那么配置文件
  3. 一旦你确切地知道需要优化什么,做一些调整,并始终记录它

请注意,与"非优化"代码相比,几年前完成的某些优化可能会使代码运行速度变慢.这尤其适用于现代基于JIT的语言.

  • -1.OP提到了"大盘".此外,代码显然已经很简单了.此外,OP似乎正处于优化阶段.关于性能的问题,例如"过早的优化是blabla的根源"(实际上是Knuth的错误引用),这是SO的瘟疫. (17认同)
  • -1优化在真实(专业)世界中很重要,因为事物通常是非常大的.不要在没有任何理性原因的情况下盲目地进行优化 (10认同)
  • +1有关何时优化的好建议. (2认同)
  • 这里没有任何意义。废话。这里的优化当然很重要。 (2认同)