Python的崛起与繁荣

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

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的新项目而努力。

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

  1. 《拥抱变化——社交网络时代的企业转型之道》一构筑社会信任

    本节书摘来异步社区<拥抱变化--社交网络时代的企业转型之道>一书中的第1章,作者: [美]Sandy Carter 译者: 侯德杰 责编: 赵轩, 更多章节内容可以访问云栖社区" ...

  2. 汇编和python-现在是Java和Python的时代,有谁还需要C以及汇编呢?

    有人认为,现在是Java和Python的时代,有谁还需要C以及汇编呢?殊不知,Java和Python是建立在软件之上的,是为了垄断市场而建立起来的体系,犹如挖好一个金碧辉煌的坑,请你往下跳,还自以为站 ...

  3. python利器的使用-PPython:PHP 拥抱 Python 的利器

    原标题:PPython:PHP 拥抱 Python 的利器 原创: 作者/望星星降 介绍 Python 与 PHP 都是广泛使用的语言,各有所长,让人期待两者结合可以实现更丰富的效果. 在 PHP 中 ...

  4. Python正在勒死R吗?

    Python作为世界第三大热门语言,早已在数据科学中被广泛使用.而同样是数据科学中流行的另一种语言R,却正处于衰退期.因此IT圈有一种说法:Python是踩着R上位的,R成为了Python的垫脚石.那 ...

  5. Python 2 最后一个版本发布,正式迈入 Python 3 时代

    北京时间 2020 年 4 月 20 日 23 点 06 分,Python 2 维护者兼发布经理本杰明·彼得森(Benjamin Peterson)在邮件组中正式声明,Python 2.7.18 正式 ...

  6. python r语言 结合 部署_(转)python中调用R语言通过rpy2 进行交互安装配置详解...

    python中调用R语言通过rpy2 进行详解 1.R语言的安装: 大家进行R语言的安装,在安装好R后,需要配置环境变量R才能进行使用. 对此电脑右键->选择高级设置->环境变量-> ...

  7. python打开哪个答案_关于 Python 文件的 ‘r’ 打开模式,哪个选项的描述是正确的?_学小易找答案...

    [单选题]以下选项对文件描述错误的是( ). [单选题]关于 Python 的元组类型,以下选项错误的是: [单选题]下列程序的输出结果为[ ]. def fun(a,b): return a+b c ...

  8. kettle大于0的转换成1_第一期实训周:基于Python+MySQL+Kettle+R的某网站数据采集分析...

    ↓ 基于Python+MySQL+Kettle+R的 某网站数据采集分析 哈喽!各位学员们 咱们第一期课程就要开始了 下面划重点! 一 高校院系 齐鲁工业大学数学与统计学院应用统计系 二 实训日期 2 ...

  9. rstudio运行python_RStudio 1.2发布,改进对Python chunks,R脚本等的测试和支持

    上周,RStudio背后的团队发布了RStudio 1.2,其中包括数十项新的生产力增强和功能. RStudio 1.2与SQL,Stan,Python和D3中的项目兼容.在此版本中,测试R代码集成, ...

  10. 微软彻底拥抱 Python!

    [CSDN 编者按]一直以来,C# 可以说是微软在编程语言方面最为显著的一大标签,甚至于知乎上都有「微软的所有程序员都用 C# 吗?」的提问.但时至今日,微软正在逐步地拥抱 Java.JavaScri ...

最新文章

  1. oracle impdp无法打开日志文件,Solaris 下 Oracle impdp 过程中出现的问题
  2. mysql 全面知识点_Mysql知识点整理
  3. Centos下安装MongoDB复制集
  4. DSP学习 -- C语言实现 SHA-1、MD5、UUID、AES128、base64
  5. virtualenv模块使用
  6. 求2个数的最大公约数
  7. CVPR 2021 | 基于随机标签的神经架构搜索
  8. 这个GitHub 1400星的Git魔法书火了,斯坦福校友出品
  9. java knn文本分类算法_使用KNN算法的文本分类.PDF
  10. 极简潮流!最新海报欣赏给你设计灵感
  11. css mix-blend,CSS mix-blend-mode 属性
  12. IDEA自动编译不用每次make
  13. 使用 golang-plugins 时要避免的事情
  14. 微信浏览器中页面刷新
  15. java基础47 装饰着模式设计
  16. map赋值给另一个map_如何写出一个能让面试官直呼“666”的深拷贝?
  17. 均匀线阵常规波束形成 matlab程序,波束形成Matlab程序
  18. 如何用安装启动盘启动计算机,用u盘启动电脑进入系统安装 如何进入启动u盘安装系统...
  19. WORD 表格中图片显示不出来?
  20. 如何学习网络安全?(网络安全学习笔记)

热门文章

  1. 大年初一连夜带娃改bug:CTO把代码写成这鬼样子,被害惨了!
  2. 操蛋!新来的同事竟然不会在javaee项目中使用WebSocket~
  3. 架构师必备!英特尔携手Science联袂推出“架构师成长计划”,来自阿里云、AWS、百度、顺丰、平安等头部大厂专家分享实战经验...
  4. Redis深入之道:原理解析、场景使用以及视频解读
  5. 承认吧,你就是不行!
  6. 经济下行,薅点羊毛吧!
  7. 薄荷Android团队成员Blog
  8. 数组:正整数数组分成2组使其和的差的绝对值最小
  9. Jquery的parent和parents(找到某一特定的祖先元素)
  10. VB API 之 第七课 字体应用四