Предположим, у меня есть метод Python, который объединяет в цепочку большое количество генераторов. Здесь цепочка не относится к возврату результатов всех итераторов один за другим, а к использованию вывода одного итератора в качестве ввода для другого генератора.
Как я могу сформулировать метод так, чтобы он (1) не был склонен к переполнению стека и (2) оставался эффективным, то есть не требовал оценки всего генератора, когда запрашивается только одно значение.
Пример с 3 различными реализациями соединения генератора chain
n
раз:
from itertools import chain
from functools import reduce
mygenerator = chain
def f1(n):
result = []
for i in range(n):
result = mygenerator(result, [1])
return result
def f2(n):
return reduce(lambda x, y: mygenerator(x, [1]), chain([[1]], range(n-1)))
def f3(n):
result = []
for i in range(n):
result = list(mygenerator(result, [1]))
return result
Запуск f1
или f2
с большим аргументом (скажем, 100000) приводит к ошибка. Вместо этого выполнение f3
неэффективно.
Я знаю, что можно переформулировать каждую рекурсию как для l oop. Как мне сделать это здесь с помощью pythoni c?