所以我在 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
参数,默认为 128
和 False
。
有没有更聪明的方法将装饰器分配给函数,而不是只定义没有 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/