あなたはos.walk()
scandir
より良いを行うことができないというのは本当ではありません2〜20倍高速であると言われています。 https://pypi.python.org/pypi/scandirから
Pythonの組み込みのos.walk()ので、それは必要以上にかなり遅いです - 加えて、各ディレクトリ上)(LISTDIRを呼び出す - それは、それぞれ上のstat()を呼び出し、ファイル名がディレクトリかどうかを調べます。しかし、Windows上のFindFirstFile/FindNextFileとLinux/OS X上のreaddirは、すでに返されたファイルがディレクトリかどうかを示しているので、それ以上のstatシステムコールは必要ありません。要約すると、システムコールの数を約2NからNに減らすことができます.Nはツリー内のファイルとディレクトリの総数です。
実際には、これらの余分なシステムコールをすべて削除すると、Windowsではos.walk()が約7〜50倍、LinuxとMac OS Xでは約3〜10倍速くなります。マイクロ最適化についてpython 3.5から
、PEP 471のおかげで、scandir
は現在、内蔵されて、os
パッケージで提供。小(未テスト)例:
for dentry in os.scandir("/path/to/dir"):
if dentry.stat().st_size > max_value:
print("{} is biiiig".format(dentry.name))
(もちろん、あなたはいくつかの点でstat
が必要ですが、機能を使用する場合os.walk
であなたが暗黙的にstat
と呼ばれます。またファイルがさらに節約、あなたがstat
た場合にのみ、拡張マッチを行うことができ、いくつかの特定の拡張子を持っている場合)
そして、それによりがあります:だから
だけでなく、SCANDIRを提供( )iterator関数を呼び出すことで、Pythonの既存のos.walk()関数を大幅に高速化できます。
Python 3.5以上に移行すると、コードを書き直すことなく、os.walk
が魔法のように高速化します。
私の経験から、stat
コールをネットワークドライブに乗算することはパフォーマンス上致命的です。ターゲットがネットワークドライブの場合は、ローカルディスクユーザー以上にもこの機能が役立ちます。
ネットワークドライブでパフォーマンスを得る最も良い方法は、ドライブがローカルにマウントされているマシン(たとえばssh
を使用)でスキャンツールを実行することです。あまり便利ではありませんが、それだけの価値があります。
残念ながら、そうする方法はありません。たとえば、「Everything」というプログラムはドライブ全体を索引付けし、フィルターに基づいてファイルをソートすることができます。このプログラムでさえ、この「速い道」を見つけることができません。 Pythonは異なるものであってはなりません。 os.walkと.getsize()は主にオペレーティングシステムに依存し、主に非Pythonコードを実行するため、別の言語を使用しても何も変更されません。 – ProgramFast
私はpythonがディスクの読み取り速度を向上させるとは思わない。私はあなたが探しているのは並列化して、同時にすべてのサーバをチェックできることだと思います。その後、合計で数時間かかるだけです。 –
@RobertSeaman私は並列化のコンセプトに精通していません。自分の方法で送信できる情報のリンクはありますか? – user7439019