4

我正在使用os.walkfnmatch过滤器来搜索电脑硬盘中的所有图像文件。这工作得很好,但非常慢,因为搜索 +-70000 张图像大约需要 9 分钟。

关于优化此代码以更快运行的任何想法?还有其他建议吗?

顺便说一句,我正在使用 python 2.7.2。

import fnmatch
import os

images = ['*.jpg', '*.jpeg', '*.png', '*.tif', '*.tiff']
matches = []

for root, dirnames, filenames in os.walk("C:\\"):
    for extension in images:
        for filename in fnmatch.filter(filenames, extension):
            matches.append(os.path.join(root, filename))
4

3 回答 3

4

我不是那些总是求助于re锤子来解决所有问题的正则表达式疯子之一,但这实际上在我的测试中比你的 fnmatch 版本快两倍多:

import os
import re

matches = []

img_re = re.compile(r'.+\.(jpg|png|jpeg|tif|tiff)$', re.IGNORECASE)

for root, dirnames, filenames in os.walk(r"C:\windows"):
    matches.extend(os.path.join(root, name) for name in filenames if img_re.match(name))
于 2012-05-18T22:55:02.257 回答
2

Python 对我来说看起来很不错。

你可以尝试

for root, dirnames, filenames in os.walk("C:\\"):
    for extension in extensions:
        matches.extend(os.path.join(root, filename) for filename 
                       in fnmatch.filter(filenames, extension))

如果这没有影响(我想不会),我相信您的硬盘已成为该过程的瓶颈(请记住,磁盘 == 慢,您正在迭代并列出系统中每个目录的文件) .

如果硬盘瓶颈,那么多个dir /s ...语句的结果绝对不应该比 Python 解决方案快得多。

于 2012-05-18T22:20:19.410 回答
2
import os
extns = ('.jpg', '.jpeg', '.png', '.tif', '.tiff')
matches = []
for root, dirnames, fns in os.walk("C:\\"):
    matches.extend(
        os.path.join(root, fn) for fn in fns if fn.lower().endswith(extns)
        )
于 2012-05-18T23:05:40.280 回答