Он не хранит промежуточные результаты , но должен хранить входные значения, поскольку каждое из них может понадобиться несколько раз для нескольких выходных значений.
Поскольку вы можете выполнять итерацию только один раз, product
не может быть реализовано эквивалентно этому:
def prod(a, b):
for x in a:
for y in b:
yield (x, y)
Если здесь b
- итератор, он будет исчерпан после первой итерации внешнего цикла, и в последующих выполнениях for y in b
.
больше элементов не будет.
product
обходит эту проблему, сохраняя все элементы, созданные b
, чтобы их можно было использовать повторно:
def prod(a, b):
b_ = tuple(b) # create tuple with all the elements produced by b
for x in a:
for y in b_:
yield (x, y)
Фактически, product
пытается сохранить элементы, произведенные всеми итерациями, которые ему даны, хотя этого можно было бы избежать для его первого параметра. Функция должна пройти только первую итерацию один раз, поэтому ей не придется кэшировать эти значения. Но он все равно пытается это сделать, что приводит к MemoryError
, который вы видите.