使用lru_cache

时间:2018-07-24 18:32:59

标签: python-3.x caching recursion

我想使用lru_cache计算一个递归函数。这是它的简化版本:

from functools import lru_cache

@lru_cache(maxsize=None)
def f(n:int)->int:
    if (n==0): return 1
    return n+f(n-1)

### MAIN ###
print(f(1000))

当我运行f(100)时效果很好,但使用f(1000)时我得到:

RecursionError: maximum recursion depth exceeded in comparison

一种解决方案是为自己计算一个值表。是否有不需要我手动创建值表的解决方案?

1 个答案:

答案 0 :(得分:1)

请注意,您可以按原样使用函数,但是您需要确保每个新调用在达到缓存值或递归基本情况之前不必递归超过几百个级别;例如,

>>> f(400)
80201
>>> f(800)  # will stop recursing at 400
320401
>>> f(1000) # will stop recursing at 800
500501

我有时会使用它;-)更一般而言,您可以编写一个包装函数,该函数反复尝试f(n),捕获RecursionError,然后退回以越来越小的值进行调用n中的。例如,

def superf(n, step=400):
    pending = []
    while True:
        pending.append(n)
        try:
            f(n)
            break
        except RecursionError:
            n = max(n - step, 0)
    while pending:
        x = f(pending.pop())
    return x

然后

>>> superf(100000)
5000050001