Groovy中那些神奇註解之Memoized

2021-07-28 11:00:05 字數 1092 閱讀 8715

好了,閒話少說,第乙個註解:memoized

至於memoized的作用,看名字就很明白了,就是「記住」,沒錯,就是把方法的執行結果快取起來,下次呼叫時,如果引數一樣,那方法就不再計算而是直接返回結果了,該註解對於那些引數範圍比較少,並且只要引數一定,那麼結果肯定也是唯一的方法,有著很好的加速效果。

舉個最簡單,但是個人覺得最能體現memoized效果的例子,大家應該都實現過用遞迴方式實現斐波那契(fibnacci)數列吧,但是純粹的不加優化的遞迴方式是相當相當的沒效率的,在我的電腦上,計算到40左右,電腦就有點跑不動了,看看**:

class

fibnacci

def fibnacci_1(n)

@groovy.transform.memoized

def fibnacci_2(n)

//測試不使用memoized

def runwithoutmem()的fibnacci值是$,共用時$毫秒,函式呼叫共$次"

}//測試使用memoized

def runwithmem()的fibnacci值是$,共用時$毫秒,函式呼叫共$次"

}}def fib = new fibnacci(40)

fib.runwithoutmem()

fib.runwithmem()

fibnacci_1和fibnacci_2方法實現是完全一樣的,唯一的不一致就是乙個加上了註解,同時我在類裡面加上了乙個變數total,來統計方法一共被呼叫了多少次,把上面的**複製到groovy自帶的groovyconsole程式中(神器呀),直接就可以執行,看看結果:

result: 未使用memoized,40的fibnacci值是165580141,共用時6040毫秒,函式呼叫共331160281次

使用memoized,40的fibnacci值是165580141,共用時4毫秒,函式呼叫共41次

結果很驚人吧,因為memoized把計算的結果快取下來了,如果引數一樣就不用再重複計算了,所以效率自然大大提高,這就好像我們用陣列方法來實現fibnacci從而提高效率原理是差不多的,不過這樣小小的乙個註解,可以少寫好多**省不少事了:)

親測 有效

盤點機器學習中那些神奇的損失函式

盤點機器學習中那些神奇的損失函式 我最近在學習r語言,但是估r語言我應該沒能跟sas一樣玩那麼好。今天來更新在機器學習中的一些專業術語,例如一些損失函式,正則化,核函式是什麼東西。損失函式 損失函式是用來衡量模型的效能的,通過 值和真實值之間的一些計算,得出的乙個值,這個值在模型擬合的時候是為了告訴...

Excel中神奇的vlookup函式之基礎應用

1 問題 如下示例,需要將右邊的 匹配上對應工號的銷售額。這屬於vlookup函式最基礎的單條件匹配應用,左邊表稱為a表。右邊表稱為b表。2 vlookup函式套路介紹 vlookup函式涉及到4個引數 根據什麼查詢你要匹配的內容,稱為查閱值,該引數 於b表。3 套用以上套路解決問題 該例子中,引數...

Mysql中那些鎖機制之InnoDB

我們知道mysql在以前,儲存引擎預設是myisam,但是隨著對事務和併發的要求越來越高,便引入了innodb引擎,它具有支援事務安全等一系列特性。innodb實現了兩種型別的行鎖。共享鎖 s 允許乙個事務去讀一行,阻止其他事務獲得相同的資料集的排他鎖。排他鎖 x 允許獲得排他鎖的事務更新資料,但是...