加速R参考类中的字段访问

时间:2014-02-09 22:20:24

标签: r reference-class

我一直在使用R reference classes编写代码。然而,随着我的进步,该计划变得无法忍受。要演示此问题,请采用以下示例:

myClass <- setRefClass(
  "Class"="myClass",
  fields=c(
    counter="numeric"
  ),
  methods=list(
    initialize=function () {
      counter <<- 0
    },
    donothing=function () {

    },
    rand=function () {
      return(runif(1))
    },
    increment=function () {
      counter <<- counter + 1
    }
  )
)

mc <- myClass()
system.time(for (it in 1:500000) {
  mc$donothing()
})
system.time(for (it in 1:500000) {
  mc$rand()
})
system.time(for (it in 1:500000) {
  mc$increment()
})

需要:

  • 4s用于调用方法
  • 7s用于生成随机数的呼叫
  • 19s来增加字段值

这是导致我出现问题的最后结果。我显然不希望增加一个数字的时间比生成一个随机数要长两倍。我的代码涉及很多访问和更改引用类中的字段值,这个性能问题使程序几乎可用。

我的问题:我可以做些什么来提高R参考类中字段查找/访问的性能?我有什么不同的做法吗?

1 个答案:

答案 0 :(得分:3)

似乎主要的性能问题是由于在fields参数中提供了类名。如果我更换

fields=c(
    counter="numeric"
),

fields=c("counter")

计算在5s完成,而19s则完成。很难从文档中确定为什么性能损失如此之大 - 也许是因为在分配期间检查了类。 documentation提及以下内容:

  

特别是,具有指定类的字段被实现为活动绑定的特殊形式,以强制对字段进行有效分配

我不太确定'主动绑定'是什么,但我认为它引入了一些预分配逻辑。