【问题标题】:Which function inside a loop is more efficient (ncol/nrow() or dim())循环内哪个函数更有效(ncol/nrow() 或 dim())
【发布时间】:2017-08-11 17:41:54
【问题描述】:

在一个练习尝试中,我尝试使用 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
  }
}

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

谢谢

【问题讨论】:

  • 你试过计时吗?另外,您是否查看过ncol 的代码?
  • 您好 A5C1D2H2I1M1N2O1R2T1 ,感谢您的快速回复。我尝试在控制台中输入不带括号的 ncol,发现它使用了dim(x)[2L]。这是否意味着这两个功能在速度方面是相同的?
  • 我尝试使用具有 10000 列/行的矩阵来计时这两个函数。 'ncol()' 方法需要很长时间才能运行,或者我的计算机有问题。
  • 如果您对效率感兴趣,您将注意力集中在代码的错误部分。您应该学习分析代码。当然,你不应该为此使用循环。
  • 我会使用(1:rows) %*% t(1:cols)

标签: r performance loops for-loop


【解决方案1】:

如果您像在示例中那样使用函数,则差异确实可以忽略不计。这是因为函数在每个循环定义中只被调用一次(而不是每次循环迭代!)

我肯定更喜欢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    
    }
}

【讨论】:

  • 这可能与原始速度几乎相同。要真正加快速度,请尝试outer(1:rows, 1:cols, "*")
  • 对于小矩阵,它确实非常相似。但是,如果您有一个包含很多列的矩阵,则原始版本将为向量1:ncol(mtx) 一次又一次地为每一行分配内存,这可能会很慢!反正你的版本当然更快,但是OP说他想学for-loops。
  • 是的,当使用具有 50 行和 1000000 列的矩阵时,微基准测试显示了约 50% 的加速。
  • @AEF 现在与this 进行比较。如果 OP 抱怨 R 冻结,50 % 的加速将无济于事。
  • @Roland,是的,我完全意识到有更快的解决方案,并且我同意您的解决方案在任何现实世界环境中都绝对更好。但是OP特别提到他想学习和理解for-loops。
猜你喜欢
  • 2017-03-11
  • 2013-09-19
  • 2011-11-04
  • 1970-01-01
  • 2016-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多