過帳Best way to allocate matrix in R, NULL vs NA?表明在R中編寫自己的矩陣分配函數可能比使用R的內置矩陣()函數預先分配大矩陣快8到10倍。R中矩陣分配更快的原因
有誰知道爲什麼手工製作的功能是如此之快? R在矩陣()內做什麼很慢?謝謝。
這裏是我的系統上的代碼:
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
我appologize那些誰評論認爲用戶定義的函數是慢的,因爲什麼被張貼在回答在上面的鏈接是不一致的。我正在查看用戶時間,在上述鏈接中速度提高了8倍,在我的系統上,用戶定義內置速度提高了10倍。
在迴應約書亞的會話信息請求:
> 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
而且,我試圖運行西蒙的三個例子,第三個例子西蒙給出的最快的,原來對我來說最慢的:
> 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
但是我仍然認爲西蒙可能是在正確的軌道上,想到matrix()
最初分配1x1矩陣然後複製它。任何人都知道R內部的任何良好的文檔?謝謝。
我不確定我關注。這個問題中的自定義函數_slower_是不是(即使這樣,大約是3)?正如在評論中指出的那樣,使用矢量化總是會快得多。 – joran
在接受的答案中,我看到用戶定義的函數比僅使用「矩陣」慢3倍。你能否提供比'矩陣'快8-10倍的自定義函數的例子? –
另請注意,在鏈接中,2個對象有不同的存儲模式(向量(可能是邏輯)與列表),所以雖然它們都是基礎,但它們在存儲的內容和附帶的開銷之間差別很大。 –