簡體   English   中英

將`functools.lru_cache`應用於lambda

[英]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只接受maxsizetyped參數,默認分別為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)

我能想到的一個具有最愚蠢功能的小例子:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM