循环中哪个函数更有效(ncol / nrow()或dim())

时间:2017-03-20 12:32:19

标签: r performance loops for-loop

在练习中,我尝试使用for循环创建乘法表。我是编程新手,R是我学习的第一门语言,所以我想知道循环中哪些函数更快更有效。目前,我没有使用apply系列的方法,因为我认为理解循环等基本功能非常重要。

以下是我用来创建乘法表的两种方法:

使用dim()功能:

mtx <- matrix(nrow=10, ncol=10)

for(i in 1:dim(mtx)[1]){
  for(j in 1:dim(mtx)[2]){
    mtx[i,j] <- i*j
  }
}

使用ncol / nrow()功能:

mtx <- matrix(nrow=10, ncol=10)

for(i in 1:ncol(mtx)){
  for(j in 1:nrow(mtx)){
    mtx[i,j] <- i*j
  }
}

哪种方式更有效,通常更好用?

谢谢

1 个答案:

答案 0 :(得分:3)

如果您使用的功能与您在示例中所使用的功能类似,那么差异实际上是可以忽略的。这是因为每个循环定义只调用一次函数(而不是每次循环迭代!)

我绝对会更喜欢ncol / nrow,因为它比dim(x)[1]更容易阅读。

话虽如此,如果你只是为了时间安排,dim功能比ncol / nrow更快。如果查看源代码,可以看到ncol实现为

function (x) 
dim(x)[2L]

表示ncol调用dim,因此速度稍慢。

如果你真的想用大矩阵保存一些速度,我建议事先创建循环向量,如下所示:

rows <- 1:nrow(mtx)
cols <- 1:ncols(mtx)
for (i in rows) {
    for (j in cols) {
        mtx[i, j] <- i * j    
    }
}