使用RCPP快速更新大列表(> 50M)

时间:2018-08-09 18:54:45

标签: c++ r performance subset rcpp

我对RCPPC++很陌生。

我正尝试使用我用C ++编写的一段代码快速更新一个庞大的列表(5900万个元素),而我几乎就在那里。它可以工作,并且快12k。

编辑:

有没有更快的方法来更新列表中的单个元素? (我最初的问题已在评论中解决。)

下面有一个简化的示例,其中包含一个小列表,一个基准测试则包含一个大列表。

输入示例:

set.seed(311)
L <- lapply(1:5, function (x) {rnorm(sample(1:5, size = 1, replace = T))} )

L[[1]] 
[1] 9 7 8 3

OUTPUT R代码:

new_element <- c(1, 2)
k = 1L
L[[k]] <- c(L[[k]], new_element)

L[[k]]
[1] 9 7 8 3 1 2

功能RCPP代码:

#include <Rcpp.h>
using namespace Rcpp;


// [[Rcpp::export]]
List assign_list(List x, int k, NumericVector upd){
  // initialize an accumulator variable

  NumericVector xk = x[k-1];
  NumericVector y = NumericVector(xk.size() + upd.size());

  for(int i = 0; i < xk.size(); ++i) {
    y[i] = xk[i];
  }

  int i = 0;
  for(int j = xk.size(); j < y.length(); ++j) {
    y[j] = upd[i];
    i += 1;
  }

  x[k-1] = y;

  return(y);

}

输出RCPP代码

set.seed(311)
L <- lapply(1:5, function (x) {sample(1:10, sample(1:5, size = 1, replace = T))} )

assign_list(L, 1L, new_element)
L[[k]] 
[1] 9 7 8 3 1 2

BENCKMARK

set.seed(311)
L_big <- lapply(1:10000000, function (x) {sample(1:10, sample(1:5, size = 1, replace = T))} )
microbenchmark(times = 5L,
  "r"   = L_big[[k]] <- c(L_big[[k]], new_element),
  "C++" = assign_list(L_big, k, new_element)
)

Unit: microseconds
 expr   min         lq        mean     median         uq        max neval cld
    r 9.625 199263.953 163516.4662 201014.890 205111.533 212182.330     5   b
  C++ 3.850     14.758     13.4744     15.078     15.399     18.287     5  a 
> 

0 个答案:

没有答案