我正在使用Rcpp
实现一个引导程序,似乎遇到了性能瓶颈(?)。基本上,我使用RcppArmadillo
创建启动矩阵,从fit_power_law
调用igraph
函数并估计幂律系数。代码如下:
#include <RcppArmadillo.h>
#include <RcppArmadilloExtensions/sample.h>
using namespace Rcpp;
// [[Rcpp::depends(RcppArmadillo)]]
double alphaPLFit(const arma::vec& x) {
Environment igraph("package:igraph");
Function fit_power_law = igraph["fit_power_law"];
List p = fit_power_law(Named("x", x));
return p["alpha"];
}
arma::mat bootstraps(const arma::vec& x, int times) {
arma::mat bootMatrix;
for (int t = 0; t < times; ++t) {
arma::vec resample = RcppArmadillo::sample(x, x.n_elem, true);
bootMatrix.insert_cols(t, resample);
}
return bootMatrix;
}
// [[Rcpp::export]]
arma::vec bootAlphaPLFit(const arma::vec& x, int times) {
arma::mat bootMatrix = bootstraps(x, times);
arma::vec alphas(times);
for (int i = 0; i < times; ++i) {
double alpha = alphaPLFit(bootMatrix.col(i));
alphas[i] = alpha;
}
return alphas;
}
/***R
library(igraph)
sampleData <- degree(sample_pa(n = 1e5, m = 3, directed = FALSE))
system.time(bootAlphaPLFit(sampleData, 500))
*/
这需要大约一分钟才能在我的电脑上运行。作为比较,boot
包中的boot
函数大约需要30秒,并使用自定义统计信息调用igraph::fit_power_law
并提取alpha。
有什么方法可以加快速度吗?