數據科學大Battle,你站Python還是R
大數據文摘出品
編譯:Marcy、浩哥兒、Charlene、云舟
Python 或 R,這是一個問題。在數據科學工作中,你可能也經常遇到這個選擇困難問題。本文作者Brian Ray基于數十年的Python和R在數據科學領域的使用檢驗,分享了自己的看法,希望能夠幫大家做出更好的選擇。
希望這篇文章能幫助那些在數據科學中糾結于選擇Python還是R的小伙伴們。如果你是數據科學領域的新手,或者你需要在項目中選擇一個語言來用,這篇文章一定能幫到你。
一、也許存在第三種選項
Hadley Wickham,RStudio的首席數據科學家,已經給出了回答:與其說選擇其中一種語言(R“還是”Python)更好,還不如說讓兩種語言相互合作 (R“和”Python)是最佳的選擇。所以,我所說的第三種選項就是同時使用Python和R。這讓我很感興趣,我也將在本文末尾處詳細闡述。
Hadley Wickham推特:https://twitter.com/hadleywickham
二、如何比較R和Python
以下不是兩種語言的詳細對比清單,只是一些值得進行對比的要素:
- 歷史:R和Python有著差異明顯又相互交錯的歷史。
- 使用群體:實地調查顯示了許多復雜的社會學和人類學因素。
- 性能:詳細的性能比較,以及為什么很難比較兩種語言的原因。
- 第三方支持:模塊、代碼庫、可視化工具、組織及開發環境。
- 用例:某些類型的工作或任務中,更適用于使用兩種語言中的一種。
- 同時使用兩種語言:在Python中使用R,在R中使用Python。
- R與Python預測能力的比較:介紹一個“自給自足”的練習。
- 企業和個人偏好:揭曉最終答案
1. 歷史
簡史:
- 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年)
2. 使用群體
比較Python與R的用戶時,要謹記以下圖表:
只有50%的Python用戶同時使用R
上述結果假設所有的R程序員都用R來做“科學與數據研究”,無論程序員水平如何,我們能夠確定以上統計分布是真實的。
想進一步了解Python的“熱潮”,可以閱讀我的文章,里面有關于Python熱潮的調查結果。
文章鏈接:
https://www.linkedin.com/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千顆星的用戶收藏。
3. 性能
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]
- %%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)
運行結果:
- 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)
運行結果:
- 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語言包的依賴性很大。這就引出了兩種語言模塊和庫上更深層次的比較,事實上,這也是一個更具意義的比較。
4. 第三方支持
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倍,但數據科學相關的軟件包的數量大致相同。
第三方工具包的可用性是非常重要的。為了用指定的開發語言而不得不從頭開始寫程序很令人沮喪。但與此同時,如果你確實需要這樣做,我希望你能將你的成果貢獻給開源社區。
5. 特定任務下執行速度的比較
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語言編譯的.
6. 數據可視化的比較
我真正想表現的是ggplot2和matplotlib的比較。
Matplotlib是一只800磅的大猩猩,雖然學習起來不是那么容易,但是支持自定義并且非常容易擴展。而基于ggplot的自定義不是那么簡單,甚至有些時候會非常難。
如果你喜歡漂亮的圖表,并且不怎么需要自定義,R是個好選擇。如果你需要更多的功能,那么Matplotlib甚至其他交互式的制圖工具會對你更有幫助。R中的ShinnyR也可以為你提供這種交互性制圖。
7. 我們只能二選一?
肯定有人會說,為什么不能同時使用呢?
在如下一些情況下,你可以兩個同時使用:
- 你的小組或公司允許你這么干
- 你可以在你的編程環境中輕松安裝和維護
- 你的代碼不需要進入另一個系統
- 這不會讓別人與你合作時感到困惑。
兩種語言同時使用的一些方法:
- Python為R提供的開發包比如:rpy2、pyRserve、Rpython等等
- R也有相對應的包:rPython、PythonInR、reticulate、rJython、SnakeCharmR、XRPython。
- 使用Jupyter,同時使用,示例如下:
reticulate地址:
https://blog.rstudio.com/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
8. 預測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用戶
9. 企業和個人偏好
當我與Google員工 、Stack Overflow 的領導人物Alex Martelli進行交流時,他向我解釋了google為什么最開始只官方支持少數幾種開發語言。即使在像google這樣自由創新的環境下,似乎也有一些限制。這就是企業的一些選擇偏好。
除了企業偏好外,組織中第一個使用某種語言的人也可能是決定企業偏好的關鍵人物。比如在Deloitte第一個使用R的人,他仍然在公司工作,并且現在成為了首席數據科學家。我認為,不管用什么語言,關鍵是追求并熱愛你的項目并努力成為最好的那一個。
雖然我不是首次嘗試這些工具的智者,但在此我還是要鄭重聲明,如果你正在研究一些重要的項目,那么在項目中去比較兩種語言的差距是不可取的。
當然,雖然錯誤在所難免,但每一個精心規劃的項目都應該為數據科學家預留一部分空間,讓他們學習和實驗。保持開放的態度,并擁抱多元化。
最后,從個人角度來說,我將主要使用Python。同時不管未來是和Python一起使用還是獨立使用R,我都期待學習更多的R知識。
相關報道:
https://blog.usejournal.com/python-vs-and-r-for-data-science-833b48ccc91d
【本文是51CTO專欄機構大數據文摘的原創譯文,微信公眾號“大數據文摘( id: BigDataDigest)”】