7

部分的なディレクトリリストを取得することは可能ですか?

os.listdirPythonでは、 100,000を超えるファイルを含むディレクトリを取得しようとするプロセスがあり、それは永遠にかかります。たとえば、最初の1,000個のファイルのリストをすばやく取得できるようにしたいと思います。

どうすればこれを達成できますか?

4

1 に答える 1

3

ファイルのランダムな順序を与える解決策を見つけました:)(少なくともパターンは見えません)

まず、python maillist でこの投稿を見つけました。ディスクにコピーする必要がある 3 つのファイルが添付されています ( opendir.pyx, setup.py, test.py)。次に、投稿からファイルをコンパイルするための python パッケージPyrexが必要です。Pyrex のインストールに問題があり、経由opendir.pyxでインストールする必要があることがわかりました。次に、上記の 3 つのダウンロード ファイルからパッケージを .xmlでインストールしました。このファイルには、使用方法の例が含まれています。python-devapt-getopendirpython setup.py installtest.py

次に、このソリューションが os.listdir を使用するよりもどれだけ高速になるかに興味があり、次の小さなシェルスクリプトで 200000 個のファイルを作成しました。

for((i=0; i<200000; i++))
do
    touch $i
done

次のスクリプトは、ファイルを作成したばかりのディレクトリで実行されている私のベンチマークです。

from opendir import opendir
from timeit import Timer
import os

def list_first_fast(i):
    d=opendir(".")
    filenames=[]
    for _ in range(i):
        name = d.read()
        if not name:
            break
        filenames.append(name)
    return filenames

def list_first_slow(i):
    return os.listdir(".")[:i]

if __name__ == '__main__':
    t1 = Timer("list_first_fast(100)", "from __main__ import list_first_fast")
    t2 = Timer("list_first_slow(100)", "from __main__ import list_first_slow")
    print "With opendir: ", t1.repeat(5, 100)
    print "With os.list: ", t2.repeat(5, 100)

私のシステムの出力は次のとおりです。

With opendir:  [0.045053958892822266, 0.04376697540283203, 0.0437769889831543, 0.04387712478637695, 0.04404592514038086]
With os.list:  [9.50291895866394, 9.567682027816772, 9.865844964981079, 13.486984968185425, 9.51977801322937]

ご覧のとおり、200000 件中 100 件のファイル名を含むリストを返すと、200 倍高速化されました。

これがあなたが達成しようとしている目標であることを願っています。

于 2012-08-29T07:02:04.577 に答える