我最近嘗試過Googleogo foo.bar challenge。在我的時間到了之後,我決定嘗試找到解決方案來解決我無法做到的問題,並找到了解決方案here(如果您有興趣,請提供問題說明)。我以前一直在爲我想要緩存的每個函數製作字典,但看起來在這個解決方案中,任何函數/輸入都可以使用相同的語法進行緩存。使用* args和lambda函數在python中緩存
首先,我很困惑代碼是如何工作的,* args變量沒有作爲參數輸入(並且沒有輸出)。這裏有一個改進小例子來說明我的困惑:
mem = {}
def memoize(key, func, *args):
"""
Helper to memoize the output of a function
"""
print(args)
if key not in mem:
# store the output of the function in memory
mem[key] = func(*args)
return mem[key]
def example(n):
return memoize(
n,
lambda: longrun(n),
)
def example2(n):
return memoize(
n,
longrun(n),
)
def longrun(n):
for i in range(10000):
for j in range(100000):
2**10
return n
這裏我用同樣的memoize的功能,但打印。函數示例返回memoize(n,一個lambda函數,)。函數longrun僅僅是一個標識函數,它有很多無用的計算,因此很容易看出緩存是否正常工作。(示例(2)第一次需要約5秒鐘,幾乎是瞬間)。
這裏是我的困惑:
- 爲什麼memoize的第三個參數是空的?當打印參數記憶它打印()。但不知何故mem [key]將func(* args)存儲爲func(key)?
- 爲什麼這種行爲僅在使用lambda函數時才起作用(示例將緩存但示例2不會)?我認爲lambda:longrun(n)只是給出一個返回longrun(n)的函數的簡短方法。
作爲一個獎勵,有沒有人知道如何使用裝飾器來記憶函數?
另外我想不出一個更具描述性的標題,歡迎編輯。謝謝。
看一看https://docs.python.org/3/library/functools.html#functools.lru_cache – janbrohl
請參閱文檔和使用搜索。 ['* args'符號提供可變參數](https://docs.python.org/3/tutorial/controlflow.html#arbitrary-argument-lists)。由於您不提供任何參數,因此'* args'是空的。 'example2'不起作用,因爲你沒有提供一個*函數*,所以你提供了調用一個函數*的結果。它應該讀'memoize(n,longrun,n)'。 – MisterMiyagi
感謝@janbrohl,正是我在裝修後所做的一切! – HBeel