Эффективное подключение многих генераторов без ошибок рекурсии - PullRequest
0 голосов
/ 29 мая 2020

Предположим, у меня есть метод 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?

...