Memoise 一个以函数作为参数的函数
Memoise a function taking a function as argument
我想使用 R
包 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
有两个连续的调用,第二个 returns 1 秒,而我本可以预料到瞬间发生的事情。
这很奇怪,但似乎 memoise
当参数是函数时不适用...函数如何在内存中表示才能使其正常工作?
您的代码没有使用记忆功能。它调用导致 1 秒睡眠的原始函数。
如果您尝试 system.time(quickFunc(2, func, 3))
,您会发现第二次没有延迟。
memoise
仅 与函数参数一起工作,return 是一个 return 缓存值或调用输入的函数函数来创建它。虽然
m<-memoise(5)
不会引发错误,尝试调用它(例如使用 m(5)
)将 return 出现以下错误
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
创建了所有参数的散列并将其用作内存缓存的键,即使这些是函数。
我想使用 R
包 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
有两个连续的调用,第二个 returns 1 秒,而我本可以预料到瞬间发生的事情。
这很奇怪,但似乎 memoise
当参数是函数时不适用...函数如何在内存中表示才能使其正常工作?
您的代码没有使用记忆功能。它调用导致 1 秒睡眠的原始函数。
如果您尝试 system.time(quickFunc(2, func, 3))
,您会发现第二次没有延迟。
memoise
仅 与函数参数一起工作,return 是一个 return 缓存值或调用输入的函数函数来创建它。虽然
m<-memoise(5)
不会引发错误,尝试调用它(例如使用 m(5)
)将 return 出现以下错误
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
创建了所有参数的散列并将其用作内存缓存的键,即使这些是函数。