我们经常听到一些人谈论R语言的效率问题,又经常听到另一些人评论说这种比较是建筑在“naive”的R语言编程方法上的。如果R语言发挥到极致(仅限于我的能力范围之内),到底能优化到什么程度,这是我在本文希望讨论的问题。
在此之前,再次感谢
Iris2126同学,是他的
《【R】提升R代码运算效率的11个实用方法》让我得以展开今天的讨论,现在我还经常看会该篇文章,每每都有些收获。
今天我们延续该文的讨论,但比较的是三种最有效率的方法:C++(Rcpp)、最简向量化、和data.table格式,这三种上面文章中都有提到过,但是都不是最优化的,我根据英文原帖的跟帖高手中一些思路照搬过来了(代码非原创,荣誉归于这两位外国高手)。
1、问题的提出,假设有这么一个data.frame:
然后,判断该数据框(df)的每一行的总和是否大于4,如果该条件满足,则对应的新变量数值为’greater_than_4’,否则赋值为’lesser_than_4’。就是这么个简单的问题。
2、a)Rcpp包加载C++函数:(原帖中的C++代码无法运行,且判断语句不知所云,很可能有错漏,我恶补了Rcpp的知识后稍微改动过,可能是比较低效率的代码,请大神指正)
b)将向量化做到极致:
c)用大名鼎鼎的data.table数据结构(返回的是增加了一列的data.table,而非上两种方式中的向量)
3、OK,万事俱备,开始测试:
4、结果。在揭晓之前,我们来猜猜谁最快?C++?
当然,反正都很快就是了,不过,强中自有强中手,想不到极致向量化的方法比C++更快,而data.table又比极致向量化更快。
具体耗时可能因电脑不同而异,我在两台32位的老电脑上测试过,均是相同的快慢顺序。
5、结论——R语言的潜力我们还根本没有挖掘彻底!静下心来,好好学习吧。