也许这个问题应该出现在一些编程论坛中,但我想我会在统计界提出这个问题。以下代码说明了在R的setRefClass中执行全局赋值时的问题:
class <- setRefClass("class",
fields = list(
params = "numeric"
),
methods = list(
initialize = function() {
params <<- 5
},
do.stuff = function() {
for (i in 1:1e5)
params <<- 2
}
))
# FAST:
params <- 5
time <- Sys.time(); for (i in 1:1e5) params <- 2; time <- Sys.time() - time
print(time)
# SLOW:
newclass <- class$new()
time <- Sys.time(); newclass$do.stuff(); time <- Sys.time() - time
print(time)
pqR显示运行时略有改善,但没什么大不了的。
我想知道为什么会发生这种情况......在我看来,分配一个变量应该很快。也许这与定位对象“槽”(可变位置)有关,类似于S3 / S4类。我敢打赌,我只能用R来观察这种行为,而不是C ++。
答案 0 :(得分:5)
根据定义,将对每个“params”赋值进行错误检查,以确保只存储“数字”数据。如果定义从fields = list(params =“numeric”)更改为fields =“params”,则会更快。