C++ 优化rcpp代码

C++ 优化rcpp代码,c++,r,rcpp,C++,R,Rcpp,我开始尝试使用rcpp来提高R中for循环的速度,其中每个迭代都依赖于前一个循环(即不容易矢量化)。我当前的代码(如下)比R快一点,但没有我想象的那么快。下面的代码中有没有任何明显的低效之处,有人能发现?任何一般(或具体)建议都会有所帮助 UpdateInfections <- cxxfunction(signature(pop ="data.frame",inds="integer",alpha="numeric",t="numeric"), ' DataFrame DF(pop); I

我开始尝试使用
rcpp
来提高R中for循环的速度,其中每个迭代都依赖于前一个循环(即不容易矢量化)。我当前的代码(如下)比R快一点,但没有我想象的那么快。下面的代码中有没有任何明显的低效之处,有人能发现?任何一般(或具体)建议都会有所帮助

UpdateInfections <- cxxfunction(signature(pop ="data.frame",inds="integer",alpha="numeric",t="numeric"), '
DataFrame DF(pop);
IntegerVector xinds(inds);
NumericVector inf_time = DF["inf.time"];
IntegerVector loc = DF["loc"] ;
IntegerVector Rind = DF["R.indiv"] ;
NumericVector infector = DF["infector"] ;
IntegerVector vac = DF["vac"] ;
NumericVector wts(loc.size());
double xt = Rcpp::as<double>(t);
double xalpha = Rcpp::as<double>(alpha);


RNGScope scope;         // Initialize Random number generator
Environment base("package:base");
Function sample = base["sample"];
int n = loc.size();
int i;int j;int k;
int infsize = xinds.size();

for (i=0;i<infsize;i++) {
   int infpoint = xinds[i]-1;
    NumericVector inf_times_prop(Rind[infpoint]);
    NumericVector inf_me(Rind[infpoint]);

for (j=0; j<n;j++){
  if (j == infpoint){
wts[j] = 0.0;
  } else if (loc[j] == loc[infpoint]){
    wts[j] = 1.0;
  } else {
wts[j] = xalpha;
  }
}

inf_me = sample(n,Named("size",Rind[infpoint]),Named("prob",wts));
//Note that these will be shifted by one

for (k=0;k<Rind[infpoint];k++){
  inf_times_prop[k] = floor(::Rf_rlnorm(1.6,.6) + 0.5 + xt);
  if (inf_times_prop[k] < inf_time[inf_me[k]-1] && vac[inf_me[k]-1] == 0){
    inf_time[inf_me[k]-1] = inf_times_prop[k];
    infector[inf_me[k]-1] = inf_me[k];
  }
}
}

// create a new data frame
Rcpp::DataFrame NDF =
Rcpp::DataFrame::create(Rcpp::Named("inf.time")=inf_time,
                        Rcpp::Named("loc")=loc,
                        Rcpp::Named("R.indiv")=Rind,
                        Rcpp::Named("infector")=infector,
                        Rcpp::Named("vac")=vac);
return(NDF);
' , plugin = "Rcpp" )

<代码> UpDeaTeaBysP>您正在调用R,这不能像纯C++解决方案那样快。
你的例子也很长,太长了。我建议对各个部分进行分析和优化。唉,还没有完全免费的午餐。

< P>我们现在正在为RCPARMADILO做一个纯C++示例函数。查看此处或此处的更新。

谢谢@DirkEddelbuettel。您是否发现使用DataFrame有任何速度问题?如果我真的想改进代码,我想我需要修改一些纯C++代码来实现SAMPLE(),而不是本身,并且对R的单个或很少的调用也不是惩罚。但很抱歉,我现在无法详细介绍您的示例。但是你在循环中分配新的向量,这在任何编程语言中都是一个坏主意。你忘了提到测试。如果您有一个带有测试的慢R实现,您可以确保您的C版本不会引入bug。