发布在 R、NULL 和 NA 中分配矩阵的最佳方法?表明在 R 中编写自己的矩阵分配函数可以比使用 R 的内置 matrix() 函数预分配大矩阵快 8 到 10 倍。
有谁知道为什么手工制作的功能要快得多?R 在如此慢的 matrix() 内部做了什么?谢谢。
这是我系统上的代码:
create.matrix <- function( nrow, ncol ) {
x<-matrix()
length(x) <- nrow*ncol
dim(x) <- c(nrow,ncol)
x
}
system.time( x <- matrix(nrow=10000, ncol=9999) )
user system elapsed
1.989 0.136 2.127
system.time( y <- create.matrix( 10000, 9999 ) )
user system elapsed
0.192 0.141 0.332
identical(x,y)
[1] TRUE
我向那些评论认为用户定义的函数速度较慢的人道歉,因为上面链接的答案中发布的内容不一致。我正在查看用户时间,在上面的链接中大约快 8 倍,而在我的系统上,用户定义的与内置的大约快 10 倍。
回应 Joshua 的会话信息请求:
> sessionInfo()
R version 2.12.1 (2010-12-16)
Platform: x86_64-unknown-linux-gnu (64-bit)
locale:
[1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C
[3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8
[5] LC_MONETARY=C LC_MESSAGES=en_US.UTF-8
[7] LC_PAPER=en_US.UTF-8 LC_NAME=C
[9] LC_ADDRESS=C LC_TELEPHONE=C
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
attached base packages:
[1] stats graphics grDevices utils datasets methods base
loaded via a namespace (and not attached):
[1] tools_2.12.1
此外,我尝试运行 Simon 的三个示例,而 Simon 给出的第三个示例最快,对我来说却是最慢的:
> system.time(matrix(NA, nrow=10000, ncol=9999))
user system elapsed
2.011 0.159 2.171
> system.time({x=NA; length(x)=99990000; dim(x)=c(10000,9999); x})
user system elapsed
0.194 0.137 0.330
> system.time(matrix(logical(0), nrow=10000, ncol=9999))
user system elapsed
4.180 0.200 4.385
然而,我仍然认为 Simon 的想法可能是正确的,即matrix()
最初分配一个 1x1 矩阵然后复制它。有人知道关于 R 内部的任何好的文档吗?谢谢。