Vector từ STL

Tối ưu hóa mã R với Rcpp

Romain François

Consulting Datactive, ThinkR

Vector Rcpp vs Vector STL

Vector Rcpp

  • Lớp bọc mỏng quanh vector của R
  • Không thể đổi kích thước hiệu quả: sao chép dữ liệu mỗi lần

Vector STL

  • Độc lập với vector của R
  • Mở rộng/thu nhỏ rẻ: sao chép trung bình dần
Tối ưu hóa mã R với Rcpp

Trích các giá trị dương từ một vector

Mã R vector hóa

extract_positives <- function(x){
    x[x>0]}

Mã kém hiệu quả khi tăng kích thước vector trong vòng lặp

extract_positives_loop <- function(x){
    y <- numeric()
    for( value in x){
        if( value > 0 ){
            y <- c(x, y)}  }
    y
}
Tối ưu hóa mã R với Rcpp

Trích giá trị dương: thuật toán thay thế

  • Bước 🔃 đầu để đếm kích thước cuối cùng
NumericVector x ; 
int n = x.size() ;
int np = 0 ;
for( int i=0 ; i<n ; i++ ){ 
    if( ___ ){
        np++ ;
    }
}
Tối ưu hóa mã R với Rcpp

Trích giá trị dương: thuật toán thay thế

  • Tạo một vector có kích thước đúng
NumericVector result(np) ;
  • Bước 🔃 thứ hai để điền vector
for( int i=0, j=0 ; i<n ; i++ ){
    if( ___ ){
        result[j++] = x[i] ;
    }
}
Tối ưu hóa mã R với Rcpp

Thuật toán đơn giản hơn dùng STL

// [[Rcpp::export]]
std::vector<double> positives_stl( NumericVector x ){
    std::vector<double> out ;
    out.reserve( x.size() / 2 ) ;

    for( ___ ; ___ ; ___ ){
        if( ___ ){
            out.push_back(___) ;
        }
    }

    return out ;  
}
Tối ưu hóa mã R với Rcpp

Cùng luyện tập nào!

Tối ưu hóa mã R với Rcpp

Preparing Video For Download...