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"
た文字列)、およびプール内のタプルからの結果は、(それらのタプルのインデックスの配列を使用して)生成されます。