和或矩阵乘法更快?

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而底部使用矩阵乘法.任何提示,建议都欢迎!谢谢!

jer*_*ycg 5

您可能对该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)

所以在我的(慢)笔记本电脑上,它们或多或少都是一样的.