我对RCPP
和C++
很陌生。
我正尝试使用我用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
>