我正在使用os.walk
和fnmatch
过滤器来搜索pc的硬盘以查找所有图像文件。这非常好,但是非常慢,因为搜索+ -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))
答案 0 :(得分: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))
答案 1 :(得分: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解决方案快得多。
答案 2 :(得分: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)
)