将`functools.lru_cache`应用于lambda

7 python recursion lambda python-3.x

所以我在Python中为Fibonacci序列做了一个递归lambda.我使用递归,因为它最容易用lambda实现.

fib = lambda n: fib(n - 1) + fib(n - 2) if n > 1 else 1
Run Code Online (Sandbox Code Playgroud)

因为使用递归,相同的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)
Run Code Online (Sandbox Code Playgroud)

我得到一个错误,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'
Run Code Online (Sandbox Code Playgroud)

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

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

iob*_*der 10

尝试 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)

  • 这是因为`lru_cache()`返回一个装饰器,但不是一个装饰器; 这是一个装饰工厂. (5认同)
  • 因为当用作装饰器时这看起来很自然(这是这个功能的想法).以及如何将其他参数传递给函数? (2认同)