作者:黄天元,复旦大学博士在读,热爱数据科学与开源工具(R),致力于利用数据科学迅速积累行业经验优势和科学知识发现,涉猎内容包括但不限于信息计量、机器学习、数据可视化、应用统计建模、知识图谱等,著有《R语言高效数据处理指南》(《R语言数据高效处理指南》(黄天元)【摘要 书评 试读】- 京东图书)。知乎专栏:R语言数据挖掘。邮箱:huang.tian-yuan@qq.com.欢迎合作交流。
前段时间想开Rcpp系列,后来发现了神书Rcpp for everyone(https://teuder.github.io/rcpp4everyone_en/)之后,就停了下来。实践中不是所有任务都需要加速,但是用了Rcpp绝对是会快,哪怕写法是如此的相似。今天就来做一个实践,就是求几何平均数。前些日子看到帖子(「R」如何计算几何平均数),引用了SO上R求几何平均数的方法(Geometric Mean: is there a built-in?),因此想借此机会看看用Rcpp是否能够为这个任务加速。试验如下:
library(Rcpp)
library(microbenchmark)
# R
geo_mean_r = function(x) exp(mean(log(x)))
# C++
cppFunction('
double geo_mean_c(NumericVector x){
return exp(mean(log(x)));
}
')
# test
microbenchmark::microbenchmark(
geo_mean_r(c(45,89,90)),
geo_mean_c(c(45,89,90)),
times = 10000
)
#> Unit: microseconds
#> expr min lq mean median uq max neval
#> geo_mean_r(c(45, 89, 90)) 3.4 3.9 5.65590 4.1 4.8 2836.6 10000
#> geo_mean_c(c(45, 89, 90)) 1.1 1.6 2.96767 2.6 3.1 953.0 10000
我们可以看到,两者的写法几乎一样(因为Rcpp有语法糖,因此两者写法没有太大差异),但是运行时间几乎差了一倍。因此,在计算的时候遇到瓶颈,就可以寻求Rcpp的帮助。
Rcpp的学习就此结束了,以后根据需要来进行新的学习。虽然不能说很会写C++,但是网络上关于C++的问答资料,那是比R还要多的,所以不虚。R的好处就是,掌握了框架,要用就去延展,而不是一点一点死磕。希望未来能够利用Rcpp获得更高的计算性能。