0

Pythonでフラットな遅延生成を行うことは可能ですか? たとえば、次のコードで私がやろうとしているのは、os.walk の結果を渡し、それらの結果のみを返そうとしていることです。

def os_walk_transcript(self, walk_results):
    """Takes the results of os.walk on the data directory and returns a list of absolute paths"""
    file_check = lambda walk: len(walk[2]) > 0
    srt_prelim = lambda walk: ".srt.sjson" in " ".join(walk[2])
    relevant_results = (entry for entry in walk_results if file_check(entry) and srt_prelim(entry))
    return (self.os_path_tuple_srts(result) for result in relevant_results)

def os_path_tuple_srts(self, os_walk_tuple):
    srt_check = lambda file_name: file_name[-10:] == ".srt.sjson"
    directory, subfolders, file_paths = os_walk_tuple
    return [os.path.join(directory, file_path) for file_path in file_paths if srt_check(file_path)]

os_walk_transcript の結果が遅延評価されることは重要ですが、現在のネストされたリスト評価とは対照的に、これをフラットな方法で評価できるようにしたいと考えています。

例: 現在、結果のジェネレーターから結果を求めると、完全なリストを取得し、["1.srt.sjson", "2.srt.sjson", "3.srt.sjson"]もう一度呼び出すと、次のようになります。["4.srt.sjson"]データが十分に大きく、この動作に十分な一貫性がないプロジェクトで作業していますその結果、一貫性のないパフォーマンスが発生し、場合によってはこれにより、必要以上に速度が低下することがあります。遅延評価をさらに遅延させ、一度に 1 つずつオブジェクトをロードする方法はありますか?

4

2 に答える 2

-1

このような関数を作成できませんでしたか?

def lazyarray(index):
    return str(index) + ".srt.sjson"

次に、これを行うことさえできます

firstTen = [lazyarray(x) for x in xrange(10)]

完全に怠惰で、その実装は非常に簡単です。少し怠惰 (キャッシュ計算) を減らしたい場合は、これを実行できる可能性があります。

cache = []
def lazyarray(index):
    if len(cache) <= index:
        cache += ["" for x in xrange(index - len(cache))]
    if cache[index] == "":
        cache[index] = str(index) + ".srt.sjson"
    return cache[index]

私はこのコードをテストしていないので、微調整が必​​要になる可能性があります。ファイルを扱っているわけではありませんが、これはあなたが求めていたものではありませんか?

そして、あなたがコードのどこにいても、言うのではなく

lazyarray[5]

言うだけ

lazyarray(5)

配列と同じ効果があります。

編集:ここ__getitem__に示すように、メソッドをオーバーライドして、上記のコードに基づいたカスタム ジェネレーター クラスを作成することもできます。

于 2013-06-12T22:01:41.143 に答える