luk*_*net 2 performance r sum matrix matrix-multiplication
我有一个非常简单的问题,是使用sum或矩阵乘法更快地求和一个大的向量?更准确地说,这是我试图加速的问题的一个例子:
d <- 1000
X <- matrix(rnorm(d^2), nrow = d)
y <- rnorm(d)
## Solution 1
sum(X%*%y)
## Solution 2
rep(1, d)%*%(X%*%y)
Run Code Online (Sandbox Code Playgroud)
我已经尝试过测试这两个system.time(),但是时间相互跳跃,我无法修复它.时间非常相似,所以这个问题从实际到好奇.也许他们完全是同一时间(似乎不太可能).
这是我为测试它而编写的函数:
testSum <- function(d, its){
X <- matrix(rnorm(d^2), nrow=d)
y <- rnorm(d)
store <- matrix(NA, nrow = its, ncol = 3)
store2 <- matrix(NA, nrow = its, ncol = 3)
for(i in 1:its) store[i, ] <- system.time(sum(X%*%y))[1:3]
for(i in 1:its) store2[i, ] <- system.time(rep(1, d)%*%(X%*%y))[1:3]
return(list(sumF = mean(store[, 1]),
MM = mean(store2[, 1])))
}
testSum(1000, 100)
Run Code Online (Sandbox Code Playgroud)
输出总是看起来像这样:
$sumF
[1] 0.01021
$MM
[1] 0.01028
Run Code Online (Sandbox Code Playgroud)
顶部使用sum而底部使用矩阵乘法.任何提示,建议都欢迎!谢谢!
您可能对该microbenchmark软件包感兴趣,这是一种很容易为小函数计时的简单方法:
microbenchmark::microbenchmark(sum(X%*%y),rep(1, d)%*%(X%*%y))
Run Code Online (Sandbox Code Playgroud)
给我:
Unit: milliseconds
expr min lq mean median uq max neval
sum(X %*% y) 10.01472 10.52420 14.25944 11.11969 13.67134 74.26345 100
rep(1, d) %*% (X %*% y) 10.13382 10.55444 12.99910 10.87629 12.95769 50.38268 100
Run Code Online (Sandbox Code Playgroud)
所以在我的(慢)笔记本电脑上,它们或多或少都是一样的.