數(shù)據(jù)科學(xué)大Battle,你站Python還是R
大數(shù)據(jù)文摘出品
編譯:Marcy、浩哥兒、Charlene、云舟
Python 或 R,這是一個問題。在數(shù)據(jù)科學(xué)工作中,你可能也經(jīng)常遇到這個選擇困難問題。本文作者Brian Ray基于數(shù)十年的Python和R在數(shù)據(jù)科學(xué)領(lǐng)域的使用檢驗,分享了自己的看法,希望能夠幫大家做出更好的選擇。
希望這篇文章能幫助那些在數(shù)據(jù)科學(xué)中糾結(jié)于選擇Python還是R的小伙伴們。如果你是數(shù)據(jù)科學(xué)領(lǐng)域的新手,或者你需要在項目中選擇一個語言來用,這篇文章一定能幫到你。
一、也許存在第三種選項
Hadley Wickham,RStudio的首席數(shù)據(jù)科學(xué)家,已經(jīng)給出了回答:與其說選擇其中一種語言(R“還是”Python)更好,還不如說讓兩種語言相互合作 (R“和”Python)是最佳的選擇。所以,我所說的第三種選項就是同時使用Python和R。這讓我很感興趣,我也將在本文末尾處詳細(xì)闡述。
Hadley Wickham推特:https://twitter.com/hadleywickham
二、如何比較R和Python
以下不是兩種語言的詳細(xì)對比清單,只是一些值得進(jìn)行對比的要素:
- 歷史:R和Python有著差異明顯又相互交錯的歷史。
- 使用群體:實地調(diào)查顯示了許多復(fù)雜的社會學(xué)和人類學(xué)因素。
- 性能:詳細(xì)的性能比較,以及為什么很難比較兩種語言的原因。
- 第三方支持:模塊、代碼庫、可視化工具、組織及開發(fā)環(huán)境。
- 用例:某些類型的工作或任務(wù)中,更適用于使用兩種語言中的一種。
- 同時使用兩種語言:在Python中使用R,在R中使用Python。
- R與Python預(yù)測能力的比較:介紹一個“自給自足”的練習(xí)。
- 企業(yè)和個人偏好:揭曉最終答案
1. 歷史
簡史:
- ABC語言 ->Python問世(1989年由Guido van Rossum創(chuàng)立)-> Python 2 (2000年) -> Python 3 (2008年)
- Fortan語言->S語言(貝爾實驗室)->R語言問世(1991年由Ross Ihaka 和 Robert Gentleman創(chuàng)立)R 1.0.0 (2000年) -> R 3.0.2 (2013年)
2. 使用群體
比較Python與R的用戶時,要謹(jǐn)記以下圖表:
只有50%的Python用戶同時使用R
上述結(jié)果假設(shè)所有的R程序員都用R來做“科學(xué)與數(shù)據(jù)研究”,無論程序員水平如何,我們能夠確定以上統(tǒng)計分布是真實的。
想進(jìn)一步了解Python的“熱潮”,可以閱讀我的文章,里面有關(guān)于Python熱潮的調(diào)查結(jié)果。
文章鏈接:
https://www.linkedin.com/pulse/python-hype-survey-results-experience-any-drastic-decline-brian-ray/
如果我們僅從“科學(xué)與數(shù)據(jù)研究”群體來看,這就引出了我們的第二個觀點,即R/Python究竟適用于哪些群體?整個“科學(xué)與數(shù)據(jù)研究”群體存在著很多子群體,雖然這些子群體存在交叉,你可能會疑惑他們在更廣的大群體中是如何交互并有著不同的表現(xiàn)的。
以下是Python/R適用的一些子群體:
- 深度學(xué)習(xí)
- 機(jī)器學(xué)習(xí)
- 高級分析
- 預(yù)測分析
- 統(tǒng)計學(xué)
- 探索性數(shù)據(jù)分析學(xué)術(shù)研究
- 近乎所有的計算研究領(lǐng)域
雖然每個專業(yè)領(lǐng)域似乎都服務(wù)于特定的群體,但你會發(fā)現(xiàn)R在統(tǒng)計學(xué)和數(shù)據(jù)探索領(lǐng)域使用更廣泛。不久之前,比起使用Python進(jìn)行數(shù)據(jù)探索,啟動并運(yùn)行R能花費較少的時間,況且你還需要花時間安裝Python。
所有一切都將被Jupyter Notebooks 和Anaconda技術(shù)顛覆。
注意:Jupyter Notebooks增加了在瀏覽器中編寫Python/R的功能;Anaconda可以輕松安裝并管理Python和R及其語言包。
現(xiàn)在你可以在友好的環(huán)境中編程,并用創(chuàng)造性的方式來生成報表和完成數(shù)據(jù)分析。程序員與他們鐘愛的編程語言之間已不存在屏障。現(xiàn)在,Python能夠在一個平臺獨立運(yùn)行,并且提供前所未有的快速、簡潔的分析功能。
影響人們選擇編程語言的另一個區(qū)別在于“開源”,不僅僅在于開源庫,還包括協(xié)作群體對于開源的貢獻(xiàn)。諷刺的是,像Tensorflow和GNU科學(xué)計算庫(分別隸屬于Apache和GPL)這類開源許可軟件,似乎同時綁定Python和R。
盡管還存在不少R的支持者,但Python使用群體中更多人是Python的純粹支持者。另一方面,似乎有更多的企業(yè)支持R,尤其是那些曾經(jīng)廣泛使用統(tǒng)計學(xué)來做分析的企業(yè)。
最后,關(guān)于群體和協(xié)作,在Github中Python的支持者更多。在最新的Python語言包中,像Tensorflow這樣的包擁有超過3.5萬顆星的用戶收藏。相反,再看一下最新的R語言包,像Shiny和Stan,都只有少于2千顆星的用戶收藏。
3. 性能
Python和R的比較一直都不太容易,因為有太多指標(biāo)和情況需要測試。在任何一個特定的硬件環(huán)境上測試都很困難。有些操作分析在一種語言上已經(jīng)進(jìn)行了優(yōu)化,但在另一種語言上卻沒有。但無論如何,我們還是要進(jìn)行這項比較。
非常簡單的循環(huán)語句比較
開始之前,我們先思考一下在使用層面Python和R的區(qū)別。你真的想要用R寫很多循環(huán)嗎?我覺得不同的語言在被開發(fā)時的意圖上應(yīng)該是各不相同的。
- 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]
- %%R
- do_loop <- function(u1) {
- # Initialize `usq`
- usq <- 0
- for(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
- %%R
- u1 <- rnorm(100)
- do_loop(u1)
運(yùn)行結(jié)果:
- 1.58 ms ± 42.8 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
- %%%%timeittimeit --nn 10001000
- u1u1 == npnp..randomrandom..randnrandn((100100))
- do_loopdo_loop(u1)
運(yùn)行結(jié)果:
- 36.9 µs ± 5.99 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
在程序的合理性檢驗中,加載時間以及在命令行上的總運(yùn)行時間:R語言是0m0.238s,Python是0m0.147s。再次強(qiáng)調(diào),這并不是一個嚴(yán)謹(jǐn)?shù)目茖W(xué)測試。
但這個簡單的測試表明,Python的速度明顯更快。雖然在大多數(shù)情況下,這并不是十分重要。
一種語言的速度快慢對于一個數(shù)據(jù)科學(xué)家而言的意義在哪里呢?這兩種語言的興起是因為它們可以被當(dāng)作“命令語言”來使用。例如,我們使用Python工作時,對Pandas語言包的依賴性很大。這就引出了兩種語言模塊和庫上更深層次的比較,事實上,這也是一個更具意義的比較。
4. 第三方支持
Python擁有PyPI,而R使用CRAN,并且它們都可以使用Anaconda。
CRAN使用其內(nèi)置的“install.packages”命令進(jìn)行使用。截止撰寫本文時止,CRAN上大約有1.2萬個包可以使用。其中有超過二分之一(大約6千多個)甚至更多的包跟數(shù)據(jù)科學(xué)相關(guān)。
PyPi擁有10倍于R的包數(shù)量,14.1萬個包。其中有3700個包被標(biāo)記為用于特定的科學(xué)工程領(lǐng)域。還有很多包雖然沒被標(biāo)記但的確也用于科學(xué)應(yīng)用。
在這兩種語言中,似乎都沒有太多完全重復(fù)的包。當(dāng)我在PyPi中搜索“Random Forest”時,我們得到了170個項目,但是都不盡相同。
盡管Python的軟件包數(shù)量是R的10倍,但數(shù)據(jù)科學(xué)相關(guān)的軟件包的數(shù)量大致相同。
第三方工具包的可用性是非常重要的。為了用指定的開發(fā)語言而不得不從頭開始寫程序很令人沮喪。但與此同時,如果你確實需要這樣做,我希望你能將你的成果貢獻(xiàn)給開源社區(qū)。
5. 特定任務(wù)下執(zhí)行速度的比較
DataFrames與Pandas的比較可能更有意義。
我們進(jìn)行了一項實驗,在同一環(huán)境下比較它們針對復(fù)雜分析任務(wù)時,每一個步驟的執(zhí)行時間,結(jié)果如下。
大多數(shù)任務(wù)下Python比R更快
來源鏈接:
http://nbviewer.jupyter.org/gist/brianray/4ce15234e6ac2975b335c8d90a4b6882
實驗源碼:
http://nbviewer.jupyter.org/gist/brianray/4ce15234e6ac2975b335c8d90a4b6882
如我們看到的,Python+Pandas比R中原生的DataFrames要快的多。請注意,這并不意味著Python運(yùn)行的更快。Pandas庫是在Numpy的基礎(chǔ)上用C語言編譯的.
6. 數(shù)據(jù)可視化的比較
我真正想表現(xiàn)的是ggplot2和matplotlib的比較。
Matplotlib是一只800磅的大猩猩,雖然學(xué)習(xí)起來不是那么容易,但是支持自定義并且非常容易擴(kuò)展。而基于ggplot的自定義不是那么簡單,甚至有些時候會非常難。
如果你喜歡漂亮的圖表,并且不怎么需要自定義,R是個好選擇。如果你需要更多的功能,那么Matplotlib甚至其他交互式的制圖工具會對你更有幫助。R中的ShinnyR也可以為你提供這種交互性制圖。
7. 我們只能二選一?
肯定有人會說,為什么不能同時使用呢?
在如下一些情況下,你可以兩個同時使用:
- 你的小組或公司允許你這么干
- 你可以在你的編程環(huán)境中輕松安裝和維護(hù)
- 你的代碼不需要進(jìn)入另一個系統(tǒng)
- 這不會讓別人與你合作時感到困惑。
兩種語言同時使用的一些方法:
- Python為R提供的開發(fā)包比如:rpy2、pyRserve、Rpython等等
- R也有相對應(yīng)的包:rPython、PythonInR、reticulate、rJython、SnakeCharmR、XRPython。
- 使用Jupyter,同時使用,示例如下:
reticulate地址:
https://blog.rstudio.com/2018/03/26/reticulate-r-interface-to-python/
然后我們就可以直接傳遞Pandas的DataFrames,rpy2會自動將其轉(zhuǎn)換為R的DataFrames,并通過“-i df”進(jìn)行切換。
來源鏈接:
http://nbviewer.jupyter.org/gist/brianray/734bd54f468d9a6db9171b2cfc98405a
源碼地址:
http://nbviewer.jupyter.org/gist/brianray/734bd54f468d9a6db9171b2cfc98405a
8. 預(yù)測R和Python的未來
有人在Kaggle的Kernel平臺上發(fā)表了關(guān)于“預(yù)測開發(fā)者們用R還是Python”的分析,他基于已有數(shù)據(jù)提出了一些有意思的看法。
- 如果你打算來年向Linux靠攏,那么你更可能是Python用戶
- 如果你學(xué)習(xí)統(tǒng)計學(xué),你更可能用R;如果學(xué)計算機(jī)科學(xué),那么更可能用Python
- 如果你還年輕(18-24歲),你更可能是Python用戶
- 如果你參加代碼競賽,你更可能是Python用戶
- 如果你來年想使用android,你更可能是一個Python用戶
- 如果你來年想學(xué)習(xí)SQL,你更可能是R用戶
- 如果你使用MS Office,你更可能是R用戶
- 如果你來年想要Rasperry Pi,你更可能是一個Python用戶
- 如果你是全職學(xué)生,你更有可能成為Python用戶
- 如果您使用敏捷方法(Agile methodology),您更可能成為Python用戶
- 如果你對Ai的擔(dān)心大于期待,那么你更有可能成為R用戶
9. 企業(yè)和個人偏好
當(dāng)我與Google員工 、Stack Overflow 的領(lǐng)導(dǎo)人物Alex Martelli進(jìn)行交流時,他向我解釋了google為什么最開始只官方支持少數(shù)幾種開發(fā)語言。即使在像google這樣自由創(chuàng)新的環(huán)境下,似乎也有一些限制。這就是企業(yè)的一些選擇偏好。
除了企業(yè)偏好外,組織中第一個使用某種語言的人也可能是決定企業(yè)偏好的關(guān)鍵人物。比如在Deloitte第一個使用R的人,他仍然在公司工作,并且現(xiàn)在成為了首席數(shù)據(jù)科學(xué)家。我認(rèn)為,不管用什么語言,關(guān)鍵是追求并熱愛你的項目并努力成為最好的那一個。
雖然我不是首次嘗試這些工具的智者,但在此我還是要鄭重聲明,如果你正在研究一些重要的項目,那么在項目中去比較兩種語言的差距是不可取的。
當(dāng)然,雖然錯誤在所難免,但每一個精心規(guī)劃的項目都應(yīng)該為數(shù)據(jù)科學(xué)家預(yù)留一部分空間,讓他們學(xué)習(xí)和實驗。保持開放的態(tài)度,并擁抱多元化。
最后,從個人角度來說,我將主要使用Python。同時不管未來是和Python一起使用還是獨立使用R,我都期待學(xué)習(xí)更多的R知識。
相關(guān)報道:
https://blog.usejournal.com/python-vs-and-r-for-data-science-833b48ccc91d
【本文是51CTO專欄機(jī)構(gòu)大數(shù)據(jù)文摘的原創(chuàng)譯文,微信公眾號“大數(shù)據(jù)文摘( id: BigDataDigest)”】