在R中高效更新向量,或+ =等效

时间:2017-01-29 23:21:59

标签: r variable-assignment

我知道R(R: += (plus equals) and ++ (plus plus) equivalent from c++/c#/java, etc.?

中没有+ =运算符

以下函数迭代一堆东西并累积差异比预期慢。 最大的运行时组件是一个简单的添加,Rprof表明在以下函数中约20%的运行时是垃圾收集。这感觉就像我们在myVector中构建了~1e7记录的许多副本并丢弃它们,而就地操作不应该有这种开销

testCase <- function(f) {
  difference<-rep(0,f)
   # replicate approximate code structure of original test case
  for(i in 1:10){
    if(runif(1,0,1)>.1) {
      partialDiff<-dd(f)#
    }
    else {
        partialDiff<-dd2(f)#
    }
    difference<-difference+partialDiff
  }
  return(difference)
}


dd <- function(f) {
  result <- (1:f)
  return(result)
}
dd2 <- function(f) {
  result <- sqrt(1:f)
  return(result)
}

# now for actual profiling ; build the D i want 50 times, just to get a statistical profile of what is going on there
Rprof(tmp <- tempfile(), gc.profiling = TRUE, interval=".01")
for(i in 1:50) {
    d<-testCase(10000000)
}
Rprof()

require(proftools)
summaryRprof(tmp)
pd <- readProfileData(tmp)
#funSummary(pd);callSummary(pd);pathSummary(pd);hotPaths(pd)
plot(pd)

使用Rprof来详细说明运行时我得到了dd序列创建的运行时的以下细分(如预期的那样),calc2显示sqrt是最大的成本(如预期的那样),但f中最大的成本是做加法的努力&#34;&差LT; -difference + partialDiff&#34 ;.这不是预期的。

任何人都可以解释原因,或提供有效的解决方法吗?

RProf breakdown

  • 测试差异的长度,它不会改变 初始化。
  • 类(partialDiff)==类(差)==&#34;数字&#34;
  • length(partialDiff)== length(差异)==在测试用例中约为17M 在这里描述。
  • 注意f返回f乘1矢量,而不是f乘10矩阵

编辑:在回复评论时,我已用完整的测试用例程序替换了我的简单代码结构

0 个答案:

没有答案