R循环越来越慢



我很难理解为什么随着迭代次数的增加,这段代码(改编自R Benchmark 2.5)变得越来越慢(平均而言)。

require(Matrix)  
c <- 0;
for (i in 1:100) {
  a <- new("dgeMatrix", x = rnorm(3250 * 3250), Dim = as.integer(c(3250, 3250)))
  b <- as.double(1:3250)
  invisible(gc())
  timing <- system.time({
    c <- solve(crossprod(a), crossprod(a, b))
  })
  print(timing)
  rm(a, b, c)
}

下面是一个示例输出,每次运行略有不同。

据我所知,从一次迭代到下一次迭代都不应该保存任何东西,但时间从最初几个循环中的1秒慢慢增加到后来循环中的4秒以上。你知道是什么原因造成的吗?我该怎么解决?

将for循环切换为*apply似乎会产生类似的结果。

我知道代码没有优化,但它来自一个广泛使用的基准测试,根据导致这种行为的原因,它可能表明其结果存在严重偏差(默认情况下只迭代3次)。

我在Mac OS 10.8.4上运行R 3.0.1版(x86_64),内存为16 GB(很多都是免费的)。BLAS是OpenBLAS。

一种解决方案是使用编译器包将代码编译为字节码。这将消除奇怪的时间问题,因为它将在每次迭代中调用相同的编译代码。它还应该使您的代码更快。要在代码上启用编译器,请包括以下两行:

library(compiler)
enableJIT(3)

如果编译代码并不能消除问题,那么可疑问题的范围就会缩小。

也许您可以尝试将for循环中的代码变成一个函数。这样一来,一次跑步就不可能影响另一次跑步。此外,它还消除了由于过度使用rm()和gc()而造成的混乱。

require(Matrix)
NewFun <- function() {
    a <- new("dgeMatrix", x = rnorm(3250 * 3250), Dim = as.integer(c(3250, 3250)))
    b <- as.double(1:3250)
    timing <- system.time({
        c <- solve(crossprod(a), crossprod(a, b))
    })
    print(timing)
}
for (i in 1:100) {
    NewFun()
}

相关内容

  • 没有找到相关文章

最新更新