亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

導入函數的記憶

導入函數的記憶

慕虎7371278 2023-03-16 16:30:39
我正在創建一個裝飾器來說明記憶。對于大多數人來說,我使用的是遞歸定義的 Fibonacci 函數。我知道命名函數的記憶版本與原始版本不同會導致效率低下,因為遞歸調用將激活未記憶的函數。(參見這個老問題,Memoization python 函數)我的問題是我似乎找不到正確的語法來覆蓋導入函數的名稱。from fibonacci import fibonaccidef with_memoization(function):    past_results = {}    def function_with_memoization(*args):        if args not in past_results:            past_results[args] = function(*args)        return past_results[args]    return function_with_memoizationdef fib(n):    if n == 0:        return 0    elif n == 1:        return 1    else:        return fib(n-1) + fib(n-2)fib = with_memoization(fib)fibonacci = with_memoization(fibonacci)print(fib(100)) # completes in <1 secondprint(fibonacci(100)) # completes in >2 minutes, probably hours這里導入的斐波那契函數和fib函數是一樣的。我錯過了什么?
查看完整描述

1 回答

?
aluckdog

TA貢獻1847條經驗 獲得超7個贊

該from module import function語句將模塊中的函數別名為function. 因此,當它被裝飾時,只有別名被裝飾。遞歸調用是針對未別名函數(在模塊中),即未修飾的函數。


您可以將此視為創建部分內存,別名函數將記住其自身計算的結果,但不會記住中間步驟。在上面的代碼中,fibonacci(100)完成后將是字典中的唯一條目。(不要等待它。)


使用import module語法不會為函數起別名,module.function它是“真實”名稱。因此,應用于的裝飾fibonacci.fibonacci也將裝飾被遞歸調用的函數。


工作實施:


import fibonacci


def with_memoization(function):


    past_results = {}


    def function_with_memoization(*args, **kwargs):

        if args not in past_results:

            past_results[args] = function(*args, **kwargs)

        return past_results[args]

    return function_with_memoization



fibonacci.fibonacci = with_memoization(fibonacci.fibonacci)


print(fibonacci.fibonacci(100))


查看完整回答
反對 回復 2023-03-16
  • 1 回答
  • 0 關注
  • 114 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號