4

私はフィルターを使用os.walkfnmatchて、すべての画像ファイルを PC の hdd で検索しています。これは問題なく動作しますが、+-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 バージョンの 2 倍以上の速さで実行されました。

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 に答える