メモリに中間結果を建物高Itertools.product?

llpinokio:

私は、次のコードを持っています

from itertools import product
from time import sleep
def slowrange(n,t):
        for i in range(n):
                sleep(t)
                yield i

for n,w in product(slowrange(5,0.2),"AB"):
        print(n,w)

であるためitertools.productのdocそれは言います:

この関数は、次のコードとほぼ同等であり、実際の実装では、メモリ内の中間結果を蓄積しないことを除き

私は2本のラインを見ることになることを期待する0 A \n 0 Bことはありません、そして、0.2秒後に私が代わりにitertools.productの以下の機能を使用する場合、1秒後にすべての反復が印刷され、発生しないこと、しかし、以下の反復を見るでしょう希望の動作を実行します。

def product(itertor1,iterator2):
        for s in iterator1:
                for f in iterator2:
                        yield s,f

だから、何が起こっているのか?これはバグです?それは、ドキュメントで何か間違ってはいるのですか?

マルタインピータース:

中間結果はありません、メモリ内に構築されていません。Pythonコードでこの部分を参照することだと:

result = [[]]
for pool in pools:
    result = [x+[y] for x in result for y in pool]

が起こることは入力イテレータは、プール内のタプル、最初の行に変換されているということです。

pools = [tuple(pool) for pool in args] * repeat

プールは中間結果ではありません。あなたのslowrange()最初のタプルに消費された(別のタプルはの文字から作成され"AB"た文字列)、およびプール内のタプルからの結果は、(それらのタプルのインデックスの配列を使用して)生成されます。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=292751&siteId=1