N 维数组中边距的最快求和:apply(X, MARGIN=c(1,2), sum)
Fastest sum over margins in N-dimensional array: apply(X, MARGIN=c(1,2), sum)
我有一个 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)
) 尽可能快?
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
我有一个 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)
) 尽可能快?
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