由于我对 Rcpp 有点陌生,所以我可能在这里遗漏了一个技巧。
让我们创建两个矩阵:
library(Rcpp)
library(microbenchmark)
P <- matrix(0, 200,500)
for(i in 1:500) P[,i] <- rep(rep(sample(0:1), 2), 25)
Parent_Check <- matrix(0, nrow(P), nrow(P))
我现在想要完成以下工作:
Test1 <- function(){
for (i in 1:nrow(P)) {
Parent_Check[i,] <- apply(P, 1, function(x) all(x == P[i,]))
}
}
Test1()
然后我为 all() 创建了一个 Rcpp 版本,希望提高速度,定义为:
Rcpp::cppFunction(
'bool all_C(LogicalVector x) {
// Note the use of is_true to return a bool type.
return is_true(all(x == TRUE));
}
'
)
使用 all_C 检查速度,它被证明更慢:
Test2 <- function(){
for (i in 1:nrow(P)) {
Parent_Check[i,] <- apply(P, 1, function(x) all_C(x == P[i,]))
}
Parent_Check
}
microbenchmark::microbenchmark(Test1(), Test2(), times = 10)
expr min lq mean median uq max neval
Test1() 467.9671 471.1590 488.1784 479.4830 485.4755 578.5338 10
Test2() 544.6561 552.7025 587.8888 570.4416 641.1202 657.7581 10
麻烦的是,all_C() 比 all() 慢,所以我怀疑 Test2() 的缓慢速度需要更好的 all_C 调用以及在上面的示例中避免应用的方法。
我尝试使用这个答案在 Rcpp 中重写应用程序,但是使用这个 Rcpp 应用程序函数会使它变得更慢。
关于如何使用 Rcpp 提高 Test1() 速度的任何想法?