【发布时间】:2017-08-25 05:26:31
【问题描述】:
为什么分配给矩阵的行/列比填充相同大小的向量要慢得多?
N <- 1e8
u <- numeric(N)
system.time(u <- 1:N)
##user system elapsed
##0.091 0.100 0.191
u <- matrix(nrow=2,ncol=N)
system.time(u[1,] <- 1:N)
##user system elapsed
##2.772 0.436 3.212
我主要关心的是数组,但我想矩阵的答案也会解释数组。
N <- 1e3
uu <- matrix(N,N)
system.time({uu <- 1:(N*N)})
##user system elapsed
##0.068 0.120 0.188
uu <- array(dim=c(2,N,N))
system.time({uu[1,,] <- 1:(N*N)})
##user system elapsed
##4.409 0.241 4.657
(我无法判断分配给大型预分配向量的元素是否比分配给变量慢,因为对于我的系统能够分配的任何向量,前者总是花费 0 时间。)
【问题讨论】:
-
我看到你通过速度测试完全正确,但你能更详细地解释一下吗?你是说一列将连续存储以便缓存位置,而填充一行需要每 N 个元素跳转一次,所以重新计算位置?
-
但我也使用了数字作为向量。应该有相同数量的 int->numeric 转换,对吧?
标签: arrays r performance matrix