我開始嘗試使用rcpp
來提高R中for循環的速度,其中每次迭代取決於先前的(即不容易的矢量化)。我現在的代碼(下面)比R快一點,但速度沒有我想象的那麼快。下面的代碼中有人可以發現任何明顯的低效率?任何一般性的(或特定的)建議都會有幫助。優化rcpp代碼
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")
感謝@DirkEddelbuettel。你看到使用DataFrame的速度問題嗎?我想我需要修改一些純粹的C++代碼來實現sample(),如果我真的想改進代碼的話。 – scottyaz
不是本身,對R的單個或幾個呼叫也不是懲罰性的。但是我很抱歉,我不能詳細解釋你的例子。但是你正在loop_內部分配_new矢量,這在任何編程語言中都是一個壞主意。 –
你忘了提及測試。如果您的R測試執行緩慢,則可以確保您的C版本不會引入錯誤。 – Spacedman