[英]Memoise a function taking a function as argument
我想對以下函數使用R
包memoise
來做一些memoise
,以函數作為參數:
library(memoise)
func = function(x) x
slowFunc = function(a,f,b=2) {Sys.sleep(1); a+b}
quickFunc = memoise(slowFunc)
> system.time(slowFunc(2, func, 3))
user system elapsed
0 0 1
> system.time(slowFunc(2, func, 3))
user system elapsed
0.00 0.00 0.99
有兩個連續的呼叫,第二個按時返回1秒鍾,而我本可以期望瞬間發生。
這很奇怪,但似乎當參數是函數時, memoise
並不適用...在內存中如何表示該函數以使其起作用?
您的代碼不使用備注功能。 它調用原始函數,導致1秒鍾的睡眠。
如果嘗試使用system.time(quickFunc(2, func, 3))
您將看到第二次沒有延遲。
memoise
僅與函數參數一起使用,並返回一個函數,該函數要么返回緩存的值,要么調用輸入函數來創建它。 而
m<-memoise(5)
不會引發錯誤,嘗試調用它(例如,使用m(5)
)將返回以下錯誤
Error in mm() : could not find function "f"
您可以通過簡單地輸入memoise
來檢查函數的代碼。 結果
function (f)
{
cache <- new_cache()
memo_f <- function(...) {
hash <- digest(list(...))
if (cache$has_key(hash)) {
cache$get(hash)
}
else {
res <- f(...)
cache$set(hash, res)
res
}
}
attr(memo_f, "memoised") <- TRUE
return(memo_f)
}
顯示memoise
會創建所有參數的哈希,並將其用作內存中緩存的鍵,即使這些是函數也是如此。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.