Почему максимальная глубина рекурсии не (не всегда) происходит в понимании списка Python? - PullRequest
0 голосов
/ 19 мая 2019

Я заметил, что «превышение максимальной глубины рекурсии» не происходит, когда базовая рекурсивная функция используется внутри понимания списка, в то время как это происходит при использовании вне ее.Я хотел бы понять, почему, чтобы лучше понять, как работает списочное понимание, а затем использовать его эффективно.

Я попробовал это с базовой функцией Фибоначчи, примененной к диапазону.

from functools import lru_cache

@lru_cache(maxsize = 2048)
def fib(n): return n if n<2 else fib(n-1)+fib(n-2)

# The following will be calculated (and 5000 can be replaced by much bigger integer)
fb = [fib(n)for n in range(5000)]
print(fb[-1])

# but next line:
print(fib(500))
# will cause a RecursionError: maximum recursion depth exceeded
# And will need this to be enabled:

import sys
sys.setrecursionlimit(1024)
print(fib(500))

1 Ответ

4 голосов
/ 19 мая 2019

Каждый раз, когда понимание оценивает fib(n), оно сохраняет этот результат в кэш.К тому времени, когда он достигает fib(500), fib(499) и fib(498) уже кешируются, они больше не запускаются.Стек отправляет 1 вызов глубиной fib.

Когда вы сразу запускаете fib(500), первое, что он оценивает, это fib(499), который не кэшируется и оценивает fib(498), который некэшируется и оценивает fib(497)… вплоть до fib(1).В стек поступает 499 вызовов глубиной fib.

Вы можете увидеть то же самое, запустив:

print(fib(250))
print(fib(500))
...