2012-11-14 4 views
2

을 나는 각각의 반복은 (즉, 쉬운 벡터화) 이전에 따라 위치를 R에 for 루프의 속도를 개선하기 위해 rcpp를 사용하려고 시작했다 최적화. 내 현재 코드 (아래)는 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

당신은 빨리 순수한 C++ 솔루션이 될 수 없습니다.

귀하의 사례도 길고 너무 오래입니다. 개별 부분을 프로파일 링하고 최적화하는 것이 좋습니다. 아, 아직 완전히 무료 점심은 없습니다.

+0

@DirkEddelbuettel에 감사드립니다. DataFrame을 사용할 때 속도 문제가 있습니까? 정말 코드를 향상시키고 싶다면 sample()을 구현하기 위해 순수 C++ 코드를 적용해야 할 것입니다. – scottyaz

+0

그 자체로는 아니며, R에 대한 한 건의 전화 또는 소수의 전화는 징벌 적이 아닙니다. 하지만 죄송합니다. 지금 귀하의 예를 통해 세부적으로 작업 할 수는 없습니다. 그러나 loop_ 안에 새로운 벡터를 할당하는 것은 어떤 프로그래밍 언어에서든 나쁜 아이디어입니다. –

+1

테스트를 언급하는 것을 잊었습니다. 테스트를 통해 R 구현이 느린 경우 C 버전에서 버그가 발생하지 않도록 할 수 있습니다. – Spacedman

관련 문제