2012-11-14 48 views
2

我開始嘗試使用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") 

回答

3

您正在調用回R.這不可能是一個純粹的C++解決方案。

你的例子也很長很長。我建議分析和優化單個作品。唉,還沒有完全免費的午餐。

+0

感謝@DirkEddelbuettel。你看到使用DataFrame的速度問題嗎?我想我需要修改一些純粹的C++代碼來實現sample(),如果我真的想改進代碼的話。 – scottyaz

+0

不是本身,對R的單個或幾個呼叫也不是懲罰性的。但是我很抱歉,我不能詳細解釋你的例子。但是你正在loop_內部分配_new矢量,這在任何編程語言中都是一個壞主意。 –

+1

你忘了提及測試。如果您的R測試執行緩慢,則可以確保您的C版本不會引入錯誤。 – Spacedman