4

ディレクトリのリストを作成してその中のファイルを読み取る場合、ディレクトリ内のすべてのファイルのリストを返す場合と比較して、yield のパフォーマンスが低下し始めるのはどの時点ですか?

ここでは、(潜在的に巨大な) リストを返すのに十分な RAM があると想定しています。

PS コメント内のコードのインライン化に問題があるため、ここにいくつかの例を示します。

def list_dirs_list():
    # list version
    return glob.glob(/some/path/*)

def list_dirs_iter():
    # iterator version
    return glob.iglob(/some/path/*)

舞台裏では、 glob への両方の呼び出しが os.listdir を使用するため、パフォーマンス的には同等のように見えます。しかし、この Python docは、glob.iglob の方が高速であることを暗示しているようです。

4

4 に答える 4

5

をさらに使用してもyieldパフォーマンスが低下するポイントはありません。実際、リストで物を組み立てるyieldよりも、要素が多いほど実際に改善されます。

于 2010-02-24T23:56:03.320 に答える
2

ディレクトリのリストをどのように作成しているかによって異なります。Python のほとんどのメカニズムは、ディレクトリ リスト全体をリストに取り込みます。そんなことをすれば、たったひとつの収穫ももったいない。を使用する場合opendir(3)、XKCD の「乱数」の定義によると、おそらく乱数です。

于 2010-02-24T23:51:58.760 に答える
1

__call__yield を使用することは、機能的には、実装またはパフォーマンスの観点からでも、ファンクター クラスを作成することと似ていますが、ジェネレーターはジェネレーターのクラスに組み込まれているため、自作のクラスのメソッドよりもおそらく少し速く実際にジェネレーターを呼び出すことができる点が異なります。C 実装。

このホームを叩くために、次の使用と大まかな実装は同じです。

def generator_counter():
    i = 0
    while True:
        i += 1
        yield i

class functor_counter():
    def __init__(self):
        self.i = 0
    def __call__(self):
        i += 1
        return i
于 2010-02-25T01:09:18.123 に答える
0

Python 2.7 では、の定義glob

def glob(pathname): return list(iglob(pathname))

したがって、少なくともこのバージョンでglobは、 が より速くなることはありませんiglob

于 2011-05-22T17:14:15.723 に答える