python - 将 `functools.lru_cache` 应用于 lambda

标签 python python-3.x recursion lambda

所以我在 Python 中为斐波那契数列创建了一个递归 lambda。我使用递归是因为它最容易用 lambda 实现。

fib = lambda n: fib(n - 1) + fib(n - 2) if n > 1 else 1

因为使用递归,相同的 Fibonacci 值被计算了很多次,我认为使用缓存装饰器会有所帮助,而且我知道 functools.lru_cache 是一个简单的选择。

我知道你不能像普通函数一样将装饰器应用到使用 @functools.lru_cache 的 lambda 函数,但是当我尝试这个时:

fib = functools.lru_cache((lambda n: fib(n - 1) + fib(n - 2) if n > 1 else 1), maxsize = None)

我收到一条错误消息,提示 functools.lru_cache 不接受函数对象作为参数。

>>> fib = functools.lru_cache((lambda n: fib(n - 1) + fib(n - 2) if n > 1 else 1), maxsize = None)
Traceback (most recent call last):
  File "<pyshell#2>", line 1, in <module>
    fib = functools.lru_cache((lambda n: fib(n - 1) + fib(n - 2) if n > 1 else 1), maxsize = None)
TypeError: lru_cache() got multiple values for argument 'maxsize'

我检查了文档,看起来 functools.lru_cache 只接受一个 maxsize 和一个 typed 参数,默认为 128False

有没有更聪明的方法将装饰器分配给函数,而不是只定义没有 lambda 的函数然后应用装饰器?

最佳答案

试试 fib = functools.lru_cache()(lambda n: fib(n - 1) + fib(n - 2) if n > 1 else 1)

我相信调用lru_cache 会返回一个函数,它接受一个函数并返回一个函数。要提供最大大小,请使用 fib = functools.lru_cache(100)(lambda n: fib(n - 1) + fib(n - 2) if n > 1 else 1)

关于python - 将 `functools.lru_cache` 应用于 lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32016991/

相关文章:

python - 如何使用 BeautifulSoup 抓取 YouTube 评论

java - Java递归查找链表中的 'maximum'字符

python - 如何在我的类中正确集成 add 和 mul 方法?

python - 仅当列没有值时,Pandas DataFrame 才从另一个数据帧更新

Python 刽子手算法

javascript - 将递归 JS 函数转换为 Obj-C

string - 字符串子序列递归的时间复杂度

python - Scrapy 只抓取和爬取 HTML 和 TXT

python - 区分类的实例

python - 将单个 'for' 循环转换为嵌套 'for' 循环