记忆以函数为参数的函数

问题描述 投票:0回答:1

我想在下面的函数中使用Rmemoise做一些memoization作为参数函数:

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不适用...如何在内存中表示函数使其工作?

r memoization memoise
1个回答
2
投票

您的代码不使用memoized函数。它调用原始函数,导致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创建了所有参数的哈希,并将其用作内存缓存的键,即使这些是函数。

© www.soinside.com 2019 - 2024. All rights reserved.