这是带有输出的示例代码:
set.seed(234)
a <- matrix(rnorm(100000), 10000,100)
dim(a)
fo1 <- function() apply(a, 1, sum)
fo2 <- function() a %*% rep(1, 100)
fo3 <- function() {
n <- nrow(a)
x <- numeric(n)
for(i in seq_len(n)) x[i] <- sum(a[i, ])
}
fo4 <- function() rowSums(a)
# install.packages("microbenchmark")
require(microbenchmark)
microbenchmark(fo1 , fo2, fo3, fo4 ,times = 100000)
# expr min lq median uq max neval
# fo1 81 90 91 96 188969 1e+05
# fo2 75 87 90 94 241332 1e+05
# fo3 75 84 87 91 271085 1e+05
# fo4 72 88 91 97 39447 1e+05
我认为 apply 和 loops 应该比矢量化版本或专用 rowSums 函数慢 - 但它们似乎都给出了非常相似的结果(最大值除外)。
任何人都可以提出为什么会这样吗?