Itertools.product промежуточных результатов в памяти? - PullRequest
2 голосов
/ 14 марта 2020

У меня есть следующий код

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 do c говорится, что:

Эта функция примерно эквивалентна к следующему коду, за исключением того, что фактическая реализация не создает промежуточные результаты в памяти

я ожидал бы, что я увижу две строки с 0 A \n 0 B, а затем через 0,2 секунды я бы увидел следующую итерацию, которая, однако, не происходит, после того, как 1s все итерации напечатаны, если я использую следующую функцию вместо itertools.product, она выполняет желаемое поведение:

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

Итак, что происходит? Это ошибка? Что-то не так в документации?

1 Ответ

3 голосов
/ 15 марта 2020

Промежуточные результаты не накапливаются в памяти, нет. Это относится к этой части в коде 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"), а из кортежей в пуле создаются результаты (с использованием массива индексов в этих кортежах).

...