以下の方法で os.walk を使用して、フォルダーを再帰的に検索し、.tnt で終わるすべてのファイルを返す最も時間のかからない方法ですか?
for root, dirs, files in os.walk('C:\\data'):
print "Now in root %s" %root
for f in files:
if f.endswith('.tnt'):
以下の方法で os.walk を使用して、フォルダーを再帰的に検索し、.tnt で終わるすべてのファイルを返す最も時間のかからない方法ですか?
for root, dirs, files in os.walk('C:\\data'):
print "Now in root %s" %root
for f in files:
if f.endswith('.tnt'):
はい、os.walk
実際に使用するのが最善の方法です。
誰もが言ったように、os.walk
ほぼ間違いなくそれを行うための最良の方法です。
実際にパフォーマンスの問題があり、プロファイリングで os.walk (および/または .endswith で結果を反復) が原因であることがわかった場合、最善の答えはおそらく Python の外に出ることです。上記のすべてのコードを次のように置き換えます。
for f in sys.argv[1:]:
次に、パスを収集してスクリプトを実行できる外部ツールが必要です。(理想的には、各スクリプト実行にできるだけ多くのパスをバッチ処理します。)
ドライブにインデックスを作成した Windows デスクトップ サーチに頼ることができる場合は、特定の拡張子を持つ特定のパスの下にあるすべてのファイルを検索するために、簡単なデータベース操作を実行するだけで済みます。そのクエリを実行し、Python スクリプトに渡す引数のリストとして結果を取得するバッチ ファイル (またはクエリを実行し、結果をリストにシリアル化せずに IronPython に渡す PowerShell ファイル) を作成する方法がわかりません。の引数)、しかし、何よりも前にこれを調査する価値があります。
プラットフォームのデスクトップ検索インデックスに依存できない場合は、どの POSIX プラットフォームでも、次のワンライナー シェル スクリプトを使用するのが最も速くて簡単です。
find /my/path -name '*.tnt' -exec myscript.py {} +
残念ながら、あなたは POSIX プラットフォームではなく、find
ツールが付属していない Windows を使用しています。これは、ここですべての面倒な作業を行っていることです。
ネイティブ Windows への find のポートがありますが、コマンド ラインの複雑さを理解して、すべてを正しく引用し、パスなどをフォーマットして、ワンライナー バッチ ファイルを作成できるようにする必要があります。または、cygwin をインストールして、POSIX システムで使用するのとまったく同じシェル スクリプトを使用することもできます。または、必要なことを実行する、より Windows に適したツールを見つけることもできます。
これはおそらく、高速ではなく低速になる可能性があります。Windows は、できるだけ少ないオーバーヘッドで多くの小さなプロセスを実行するようには設計されていません。Linux や OS X などのプラットフォームよりもコマンド ラインの制限が小さいため、より多くの費用がかかる可能性があります。インタープリターが開始して終了するのを待つ時間は、保存するよりも長くなります。確認するにはテストする必要があります。実際、おそらくネイティブ バージョンと cygwin バージョンの両方をテストする必要があります (後者の場合、ネイティブ Python と cygwin Python の両方を使用します)。
実際にはfind
、呼び出しをバッチ/シェル スクリプトに移動する必要はありません。これがおそらく最も簡単な答えですが、 Python 内からのsubprocess
呼び出しに使用するなど、他にもあります。find
これにより、インタープリターの起動回数が多すぎるために発生するパフォーマンスの問題が解決される場合があります。
適切な量の並列処理を取得することも役立つ場合があります。スクリプトの各呼び出しをバックグラウンドにスピンオフし、それらが完了するのを待たないでください。(Windowsでは、シェルはこれに関与していないと思います。代わりに、シェルから切り離されたプロセスを開始する「run」などの名前のツールがあります。しかし、詳細は覚えていません。)
これでうまくいかない場合は、可能な限り高速な Win32 または .NET を実行するカスタム C 拡張機能を作成する必要があるかもしれません (これは、それが何であるかを調べるために調査を行う必要があることも意味します)。 Python内。