编译:marcy、浩哥儿、charlene、云舟
python 或 r,这是一个问题。在数据科学工作中,你可能也经常遇到这个选择困难问题。本文作者brian ray基于数十年的python和r在数据科学领域的使用检验,分享了自己的看法,希望能够帮大家做出更好的选择。
希望这篇文章能帮助那些在数据科学中纠结于选择python还是r的小伙伴们。如果你是数据科学领域的新手,或者你需要在项目中选择一个语言来用,这篇文章一定能帮到你。
也许存在第三种选项
hadley wickham,rstudio的首席数据科学家,已经给出了回答:与其说选择其中一种语言(r“还是”python)更好,还不如说让两种语言相互合作 (r“和”python)是最佳的选择。所以,我所说的第三种选项就是同时使用python和r。这让我很感兴趣,我也将在本文末尾处详细阐述。
hadley wickham推特:
https://twitter/hadleywickham
如何比较r和python
以下不是两种语言的详细对比清单,只是一些值得进行对比的要素:
历史:r和python有着差异明显又相互交错的历史。使用群体:实地调查显示了许多复杂的社会学和人类学因素。性能:详细的性能比较,以及为什么很难比较两种语言的原因。第三方支持:模块、代码库、可视化工具、组织及开发环境。用例:某些类型的工作或任务中,更适用于使用两种语言中的一种。同时使用两种语言:在python中使用r,在r中使用python。r与python预测能力的比较:介绍一个“自给自足”的练习。企业和个人偏好:揭晓最终答案
历史
简史:
abc语言 ->python问世(1989年由guido van rossum创立)-> python 2 (2000年) -> python 3 (2008年)fortan语言->s语言(贝尔实验室)->r语言问世(1991年由ross ihaka 和 robert gentleman创立)r 1.0.0 (2000年) -> r 3.0.2 (2013年)
使用群体
比较python与r的用户时,要谨记以下图表:
只有50%的python用户同时使用r
上述结果假设所有的r程序员都用r来做“科学与数据研究”,无论程序员水平如何,我们能够确定以上统计分布是真实的。
想进一步了解python的“热潮”,可以阅读我的文章,里面有关于python热潮的调查结果。
文章链接:
https://linkedin/pulse/python-hype-survey-results-experience-any-drastic-decline-brian-ray/
如果我们仅从“科学与数据研究”群体来看,这就引出了我们的第二个观点,即r/python究竟适用于哪些群体?整个“科学与数据研究”群体存在着很多子群体,虽然这些子群体存在交叉,你可能会疑惑他们在更广的大群体中是如何交互并有着不同的表现的。
以下是python/r适用的一些子群体:
深度学习机器学习高级分析预测分析统计学探索性数据分析学术研究近乎所有的计算研究领域
虽然每个专业领域似乎都服务于特定的群体,但你会发现r在统计学和数据探索领域使用更广泛。不久之前,比起使用python进行数据探索,启动并运行r能花费较少的时间,况且你还需要花时间安装python。
所有一切都将被jupyter notebooks 和anaconda技术颠覆。
注意:jupyter notebooks增加了在浏览器中编写python/r的功能;anaconda可以轻松安装并管理python和r及其语言包。
现在你可以在友好的环境中编程,并用创造性的方式来生成报表和完成数据分析。程序员与他们钟爱的编程语言之间已不存在屏障。现在,python能够在一个平台独立运行,并且提供前所未有的快速、简洁的分析功能。
影响人们选择编程语言的另一个区别在于“开源”,不仅仅在于开源库,还包括协作群体对于开源的贡献。讽刺的是,像tensorflow和gnu科学计算库(分别隶属于apache和gpl)这类开源许可软件,似乎同时绑定python和r。
尽管还存在不少r的支持者,但python使用群体中更多人是python的纯粹支持者。另一方面,似乎有更多的企业支持r,尤其是那些曾经广泛使用统计学来做分析的企业。
最后,关于群体和协作,在github中python的支持者更多。在最新的python语言包中,像tensorflow这样的包拥有超过3.5万颗星的用户收藏。相反,再看一下最新的r语言包,像shiny和stan,都只有少于2千颗星的用户收藏。
性能
python和r的比较一直都不太容易,因为有太多指标和情况需要测试。在任何一个特定的硬件环境上测试都很困难。有些操作分析在一种语言上已经进行了优化,但在另一种语言上却没有。但无论如何,我们还是要进行这项比较。
非常简单的循环语句比较
开始之前,我们先思考一下在使用层面python和r的区别。你真的想要用r写很多循环吗?我觉得不同的语言在被开发时的意图上应该是各不相同的。
import numpy as np%load_ext rpy2.ipython
defdef do_loopdo_loop(u1):# initialize `usq` usq = {}for i in range(100):# i-th element of `u1` squared into `i`-th position of `usq` usq[i] = u1[i] * u1[i]
%%rdo_loop<- function(u1) {# initialize `usq` usq <- 0for(i in 1:100) {# i-th element of `u1` squared into `i`-th position of `usq` usq[i] <- u1[i]*u1[i] }}
%%timeit -n 1000%%ru1 <- rnorm(100)do_loop(u1)
运行结果:1.58 ms ± 42.8 s per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%%%%timeittimeit --nn 10001000u1u1 == npnp..randomrandom..randnrandn((100100)) do_loopdo_loop(u1)
运行结果:36.9 s ± 5.99 s per loop (mean ± std. dev. of 7 runs, 1000 loops each)
在程序的合理性检验中,加载时间以及在命令行上的总运行时间:r语言是0m0.238s,python是0m0.147s。再次强调,这并不是一个严谨的科学测试。
但这个简单的测试表明,python的速度明显更快。虽然在大多数情况下,这并不是十分重要。
一种语言的速度快慢对于一个数据科学家而言的意义在哪里呢?这两种语言的兴起是因为它们可以被当作“命令语言”来使用。例如,我们使用python工作时,对pandas语言包的依赖性很大。这就引出了两种语言模块和库上更深层次的比较,事实上,这也是一个更具意义的比较。
第三方支持
python拥有pypi,而r使用cran,并且它们都可以使用anaconda。
cran使用其内置的“install.packages”命令进行使用。截止撰写本文时止,cran上大约有1.2万个包可以使用。其中有超过二分之一(大约6千多个)甚至更多的包跟数据科学相关。
pypi拥有10倍于r的包数量,14.1万个包。其中有3700个包被标记为用于特定的科学工程领域。还有很多包虽然没被标记但的确也用于科学应用。
在这两种语言中,似乎都没有太多完全重复的包。当我在pypi中搜索“random forest”时,我们得到了170个项目,但是都不尽相同。
尽管python的软件包数量是r的10倍,但数据科学相关的软件包的数量大致相同。
第三方工具包的可用性是非常重要的。为了用指定的开发语言而不得不从头开始写程序很令人沮丧。但与此同时,如果你确实需要这样做,我希望你能将你的成果贡献给开源社区。
特定任务下执行速度的比较
dataframes与pandas的比较可能更有意义。
我们进行了一项实验,在同一环境下比较它们针对复杂分析任务时,每一个步骤的执行时间,结果如下。
大多数任务下python比r更快
来源链接:
http://nbviewer.jupyter.org/gist/brianray/4ce15234e6ac2975b335c8d90a4b6882
实验源码:
http://nbviewer.jupyter.org/gist/brianray/4ce15234e6ac2975b335c8d90a4b6882
如我们看到的,python+pandas比r中原生的dataframes要快的多。请注意,这并不意味着python运行的更快。pandas库是在numpy的基础上用c语言编译的.
数据可视化的比较
我真正想表现的是ggplot2和matplotlib的比较。
matplotlib是一只800磅的大猩猩,虽然学习起来不是那么容易,但是支持自定义并且非常容易扩展。而基于ggplot的自定义不是那么简单,甚至有些时候会非常难。
如果你喜欢漂亮的图表,并且不怎么需要自定义,r是个好选择。如果你需要更多的功能,那么matplotlib甚至其他交互式的制图工具会对你更有帮助。r中的shinnyr也可以为你提供这种交互性制图。
我们只能二选一?
肯定有人会说,为什么不能同时使用呢?
在如下一些情况下,你可以两个同时使用:
你的小组或公司允许你这么干你可以在你的编程环境中轻松安装和维护你的代码不需要进入另一个系统这不会让别人与你合作时感到困惑。
两种语言同时使用的一些方法:
python为r提供的开发包比如:rpy2、pyrserve、rpython等等r也有相对应的包:rpython、pythoninr、reticulate、rjython、snakecharmr、xrpython。使用jupyter,同时使用,示例如下:
reticulate地址:
https://blog.rstudio/2018/03/26/reticulate-r-interface-to-python/
然后我们就可以直接传递pandas的dataframes,rpy2会自动将其转换为r的dataframes,并通过“-i df”进行切换。
来源链接:
http://nbviewer.jupyter.org/gist/brianray/734bd54f468d9a6db9171b2cfc98405a
源码地址:
http://nbviewer.jupyter.org/gist/brianray/734bd54f468d9a6db9171b2cfc98405a
预测r和python的未来
有人在kaggle的kernel平台上发表了关于“预测开发者们用r还是python”的分析,他基于已有数据提出了一些有意思的看法。
如果你打算来年向linux靠拢,那么你更可能是python用户如果你学习统计学,你更可能用r;如果学计算机科学,那么更可能用python如果你还年轻(18-24岁),你更可能是python用户如果你参加代码竞赛,你更可能是python用户如果你来年想使用android,你更可能是一个python用户如果你来年想学习sql,你更可能是r用户如果你使用ms office,你更可能是r用户如果你来年想要rasperry pi,你更可能是一个python用户如果你是全职学生,你更有可能成为python用户如果您使用敏捷方法(agile methodology),您更可能成为python用户如果你对ai的担心大于期待,那么你更有可能成为r用户
企业和个人偏好
当我与google员工 、stack overflow 的领导人物alex martelli进行交流时,他向我解释了google为什么最开始只官方支持少数几种开发语言。即使在像google这样自由创新的环境下,似乎也有一些限制。这就是企业的一些选择偏好。
除了企业偏好外,组织中第一个使用某种语言的人也可能是决定企业偏好的关键人物。比如在deloitte第一个使用r的人,他仍然在公司工作,并且现在成为了首席数据科学家。我认为,不管用什么语言,关键是追求并热爱你的项目并努力成为最好的那一个。
虽然我不是首次尝试这些工具的智者,但在此我还是要郑重声明,如果你正在研究一些重要的项目,那么在项目中去比较两种语言的差距是不可取的。
当然,虽然错误在所难免,但每一个精心规划的项目都应该为数据科学家预留一部分空间,让他们学习和实验。保持开放的态度,并拥抱多元化。
最后,从个人角度来说,我将主要使用python。同时不管未来是和python一起使用还是独立使用r,我都期待学习更多的r知识。