r - 循环内的哪个函数效率更高(ncol/nrow() 或 dim())

标签 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
  }
}

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

谢谢

最佳答案

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

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

关于r - 循环内的哪个函数效率更高(ncol/nrow() 或 dim()),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42903707/

相关文章:

r - 使用 roxygen2 导出函数列表

r - 如何阻止 knitr 添加基于 documentClass 的 tex 包?

r - 使用 ggplot 移动绘图

MySQL/PHP 查询性能?

python - 使用巨大的列表优化循环

php - 如何使用PHP的for循环来显示日期和时间?

r - rbind (deparse.level, ...) 中的错误 : invalid list argument: all variables should have the same length

django - 如何让 Spacy 的 ML 模型在 Django 应用程序中运行

performance - IndexedDB 访问速度和效率

c - 为 OpenMP 中的每个内部循环启动一个线程