我有一个4维数组,我需要计算其两个维度的总和。我发现apply
的速度非常慢。
我尝试了compiler
库,但速度几乎没有提高:
library(compiler)
X <- array(2, dim=c(1000,20,10,125))
suma <- function(X){
apply(X, MARGIN=c(1,2), sum)
}
suma.cmp <- cmpfun(suma)
benchmark(suma.cmp(X), suma(X), replications = 50)
# test replications elapsed relative user.self sys.self user.child
#1 suma.cmp(X) 50 24.616 1.000 24.164 0.424 0
#2 suma(X) 50 24.892 1.011 24.440 0.416 0
我会尝试一下Rcpp,但就我所知,RcppArmadillo
没有4维数组。
如何尽可能快地进行此计算(apply(X, MARGIN=c(1,2), sum)
)?
答案 0 :(得分:5)
rowSums
的速度提高了约15倍。它很快转到C,所以我认为很难改进它。
microbenchmark(
apply = suma(X),
rowsum = rowSums(X, dims = 2),
times = 10
)
# Unit: milliseconds
# expr min lq mean median uq max neval cld
# apply 692.14893 818.67450 828.66410 829.47926 874.23754 885.36019 10 b
# rowsum 48.39865 49.85822 51.37486 51.09379 52.04339 56.29224 10 a
identical(rowSums(X, dims = 2), suma(X))
# [1] TRUE