[英]Applying `functools.lru_cache` to lambda
所以我在Python中為Fibonacci序列做了一個遞歸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)
我能想到的一個具有最愚蠢功能的小例子:
from functools import lru_cache
@lru_cache(maxsize=32)
def identity(x):
return x
identity2 = lru_cache(maxsize=32)(lambda x: x)
第一個版本是裝飾器版本,你可以在其中看到lru_cache的第一個lru_cache
。 從那里很容易看到如何正確獲取lambda表達式的語法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.