在这个人人拥抱python的时代,R真的out了吗?

浏览: 1242

Python的崛起与繁荣

近年来,python愈发地火热,在今年年中发布的IEEE全球顶级编程语言的最新一期排名中,python以100分高居榜首,力压经典的c++、java等。近年同样非常热门的Go语言,仅排名第9。与此同时,数据科学的经典语言R,则延续小幅下滑态势,在2016年达到其历史最高的第5名后,在2017和2018年分别下跌1位,至第6和第7。R相较python的差距,在逐步扩大。

image.png

Figure 1: 2018年IEEE顶级编程语言排名榜

Python的繁荣自有其背景和道理。过去十多年,得益于搜索引擎、爬虫和轻量级web项目的大发展,以胶水语言立足的python,可以快速地用于项目开发,因而得以快速发展。近年来,随着机器学习和深度学习大行其道,胶水语言的优势被进一步放大,使得python迎来了新一轮爆发式增值。特别地,这些年,python社区通过借鉴和扩展R语言等数据科学经典语言的诸多特性,逐步完善了自身的数据分析库,进一步拓展和巩固了其在数据科学界的地位。前述编程语言排名的变化趋势,看起来也很好地印证了这一点。也因此,很多人开始高呼“python将统治数据科学界,R将逐步退出历史舞台”。作为一个不算年轻的知乎er,面对这样的问题,我们自然要秉持基本精神——先问是不是,再谈为什么。

Python与R的相爱相杀

关于python和R的对比,事实上,已经有很多分析,诸多细节已不用赘述。作为一个重度R用户和中度python用户,我想从语言特性本身,以及商业实践应用这两方面来进行一些探讨。
众所周知,R本身是一门数据分析语言或者说统计分析语言。其核心之处在于:快速、便利的统计建模。特别地,大量前沿的统计方法,会很快出现R实现,这些实现经常还是由作者本人写的。对于统计学者和建模专家而言,这是无可替代的优势。

当然,对于其他方面,可能或多或少没有那么重视,至少相对通常的编程语言而言。例如,R使用者经常发现,R的很多语法并不规范,甚至显得很混乱。同时,R的效率看起来比其他语言慢很多,包括python,以及专长矩阵计算的matlab。尤其是,R默认只使用单核,在这个多核早已是标配的时代,对计算机性能是巨大的浪费。此外,R特别耗内存,这可能与其糟糕的内存管理有关。

哦,当然,吐槽R时,我们不能忘了很重要的一点,R不擅长写循环。而且,R也没有好的面向对象的机制,作为一门经典的面向过程的语言,R里的S3方法,太笨拙。或者用四川重庆人的话来说,是“歪”(wai,念三声)的面向对象。

相较之下,python看起来要顺眼很多。Python的语法要规范很多。对于计算机出身的人,python语言很容易理解。而即便对于新手,python也更接近英语口语表达,且没有R那么多奇奇怪怪的符号。换言之,python更容易上手。Python也有更好的性能,尤其是利用numpy时,纯粹的numpy已经有还不错的性能,如果再加上cython或者numba的加持,性能更是至少可以提升一个量级,而需要做出的改动很小。此外,在python里,加入并行计算也很容易,且python天生就有很好的面向对象的机制。当然,进一步考虑到python的pandas是开发者充分借鉴R的data.frame这一基本数据格式的思想并做了大量拓展而来,以及sklearn库里逐步加入了大量机器学习相关的库,以及python在tenserflow和pytorch等深度学习框架方面有着最为完善的API,数据科学家似乎真的可以抛弃R了。

唔,让我们等等。看起来好像是这样。但这一点成立的前提是,R在近几年保持原状,毫无进步。要是R也在快速发展呢?

事实上,R这些年确实也在快速进步。这一点,也需真的要感谢RStudio,尤其是近年Hadley Wickham和Yihui Xie两位大神先后加入后。这不,这篇文章的底稿,正是用RStudio写作的(手动笑脸)。

具体而言,R在这些年的重大发展至少有以下几点。

首先,强化了数据处理和数据分析框架,大幅提升了便利性和效率。具体来说,有两套已经非常成熟的框架,一套是Hadley Wickham发展起来的tidyverse系列。另一套则是由多位作者共同开发和维护的data.table。前者对标准的语法做了拓展,并通过引入管道工具,使得语法清晰,可读性极强(这一点其实很重要,毕竟代码是写给人看的,这也是哪怕相对data.table,大多数情况下,我仍偏向使用tidyverse系列的原因),同时效率也不错。后者则更加编程语言化,语法更类似python等编程语言,与经典的R语言语法有不小的差异,同时性能上非常棒,可以处理10G以上的数据,且效率非常可观(读写数据以及查询筛选等看起来比python pandas更高效)。特别地,在tidyverse的基础上,有人进一步整合了一系列时间序列和金融分析相关的packages并做了拓展,构建了tidyquant,帮助金融从业人员更好地利用R进行投资组合评估。

其次,进一步拓展了可视化相关工具库,强化了其在可视化方面的优势。众所周知,R的可视化一直都是非常漂亮的,但与此同时,也有着让人很不舒服的一面,R语言生成的图,通常不能动态缩放和查看坐标值。这一点,通过第三方绘图库plotly的API,得以很好地解决。尤其出色的是,plotly的R API,还支持将经典的ggplot2对象转化为plotly风格的动态图,据此可以同时享有ggplot2的美观和plotly的动态特征这双重优势。此外,经典的ggplot2 package有着大量自定义参数,要用好,对于数据分析师也是不小的挑战。近年陆续出了不少拓展包,可以很便利地生成多种类型和风格的图,包括经典的Economist风格的图也支持,amazing!与此同时,R还通过shiny package及其拓展,很好地支持了以R为后台语言的动态网页开发。这一点使得数据科学家可以很便利地利用R做算法研究并绘制动态的产品原型,便利和开发人员的沟通。同时也使得内部的数据业务分析和沟通更加的便利。

再者,近年来,R大幅度提升了对于动态报告(文学化编程)的支持,这一点可能相当程度上要归功于Yihui Xie。所谓动态报告,就是将代码嵌入报告文档中,在编译最终的报告时,自动执行代码,在相应位置展示分析结果。这样,可以将很多常规性的数据分析报告,以及包含市政研究的论文写作等工作自动化。Yihui Xie制作的knitr包,大大简化了早期的Sweave的操作。在此基础上,伴随rmarkdown、bookdown、blogdown等一系列package的推出,利用Rmarkdown文档,已经可以便利地进行文章写作、书籍撰写和博客维护(作为忠实粉丝,llanglli君已经用bookdown完成了两本电子书小册子的撰写,体验是很棒的)。当然,对于论文等对排版要求极高的文章,可能还是需要先转化为latex,再进行编辑修订。但无论如何,这一流程已大大简化。

此外,R也在完善对并行计算的支持。这方面,有不少人已经大量应用于实践。我个人由于这方面的需求不是很大,加上客观条件限制,对此探索不多。对此感兴趣的朋友,可以自行google搜索相关文章。在面向对象编程方面,R也逐步加入了真正的相关机制。此外,通过Rcpp package,在对性能有着很高要求时,可以将相关部分用c++实现,再通过API调取。毕竟,R也是很好的胶水语言,只是比python确实略逊一筹而已。
当然,也并不是说在这些方面,python做得就不好,但相当程度上,确实不如R用得舒服。

相爱相杀后,携手奔前程

事实上,早有人指出,最好的出路,并非在python和R里择其一,而是两者都使用,依据具体场景选择最适合的语言,在整个流程中搭配使用。这一点,llanglli君是很认同的,尤其对于数据科学从业者而言。

在大部分领域,尤其是数据分析领域,二者的重合度越来越高,这是客观事实,但二者仍有一些显著的差异。

统计模型的易用性和新模型的及时度,R仍遥遥领先。在常见的数据处理任务上,R和python难分伯仲,依据个人习惯,选择用得顺手的语言就好。而当数据有较多脏数据和错误数据时,数据清洗工作,python通常完成得更好。在数据可视化和动态报告领域,虽然python也在快速进化,但总体上,R仍然领先。

在计算效率方面,python总体仍然领先。特别地,若是不需要涉及pandas库的任务,尤其是纯循环(典型如量化策略的回测),python相比R有巨大的性能优势,此时python自然是不二选择。在并行计算方面,R在完善,但总体仍不及python。

另一点python占据巨大优势的是工程化部署和实践。作为经典的编程语言,python有着稳定的性能,在商业化产品中可以较为放心地部署,而R由于各种原因,并不是非常稳定,可能影响系统稳定性。这一点,RStudio Server Pro和Microsoft R Server等商业化方案可能能提供更好的解决方案,但价格也不便宜。相较之下,python始终是免费的。

此外,同为有着多种用途的开源动态语言,R和python都有一个共同的特征:入门相对容易,但要用得非常好,却不是那么容易。因为二者都有着非常多的拓展库,而这些库由不同的作者贡献,有着不同的编码效率和编码习惯。由此会使得使用者可能需要花费大量的搜寻成本,以找到最高效的库,并且需要花不少学习时间来适应其风格。当然,对于Hadley Wickham这样的geek来说,这一点远非问题。毕竟,没有好用的package,自己写一个就是了。

因此,我们大概可以说,R并不会在这场数据科学的浪潮中被淘汰,而是会更加专业化。特别地,在实践中,充分利用R、python(乃至matlab等其他语言)各自的所长,进行组合使用,可能是最好的出路。这一点,R大神Hadley Wickham和python大神Wes McKinney(pandas开发者,前AQR量化研究员)看起来已经达成共识,二者正在为一个旨在打通R和python的新项目而努力。

推荐 0
本文由 R语言中文社区 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册