簡體   English   中英

使用內聯和 Rcpp 調用 R 函數仍然和原始 R 代碼一樣慢

[英]Calling an R function using inline and Rcpp is still just as slow as original R code

我需要評估一個需要長循環的函數(后驗分布)。 顯然,我不想在 R 本身中執行此操作,因此我使用“內聯”和“Rcpp”來實現 C++。 但是,我發現在每個循環使用 R 函數的情況下,cxx 函數的運行速度與運行 R 代碼一樣慢(請參閱下面的代碼和輸出)。 特別是,我需要在每個循環中使用多元正態累積分布函數,因此我使用的是 mvtnorm 包中的 pmvnorm()。

如何在 cxxfunction 中使用這個 R 函數並加快速度? 我想了解為什么會發生這種情況,以便將來可以在 cxxfunction 中使用其他 R 函數。

謝謝你。

test <- cxxfunction(
  signature(Num="integer",MU="numeric",Sigma="numeric"),
  body='
  RNGScope scope;

  Environment stats("package:mvtnorm");
  Function pmvnorm = stats["pmvnorm"];

  int num = Rcpp::as<int>(Num);
  NumericVector Ret(1);
  NumericMatrix sigma(Sigma);
  NumericVector mu(MU);
  NumericVector zeros(2);

for(int i = 0; i < num; i++)
{
  Ret = pmvnorm(Named("upper",zeros),Named("mean",MU),Named("sigma",sigma));
}
return Ret;
',plugin="Rcpp"
)

system.time(
test(10000,c(1,2),diag(2))
)
    user  system elapsed 
    5.64    0.00    5.75 

system.time(
for(i in 1:10000){
pmvnorm(upper=c(0,0),mean=c(1,2),sigma=diag(2))
}
)
   user  system elapsed 
   5.46    0.00    5.57 

您正在從 Rcpp 調用R 函數

這不會比直接調用 R 函數快。

您的綁定約束是您調用的函數,而不是您調用它的方式。 Rcpp 不是一些神奇的 R-to-C++ 編譯器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM