Norm Matloff 是加州大學戴維斯分校的計算機科學教授,他針對數據科學界常年爭論的要點,作了一篇關於 R 和 Python 的對比分析。
在分析開始之前,Matloff 先拋出自己可能帶有的潛在偏見:他寫過 4 本與 R 相關的書,在 useR! 和其他 R 的會議上做過演講,並且目前擔任 R 期刊的主編。但同時他也用 Python 敲過多年代碼。Matloff 希望自己的分析能夠被認為是公平且有幫助的。
接著,這位專業的計算機科學家和統計學家從以下幾方面對 R 和 Python 做出了對比:
Python 明顯勝出。
當然這是主觀的。但是在不同程式語言的對比之下,Python 大大減少了括號的使用:
if x > y: z = 5 w = 8
vs.
if (x > y){ z = 5 w = 8}
Python 很時尚!
R 在這一場贏得巨大勝利。
作為一名教育工作者,Matloff 對這一點尤其感興趣。
若使用 Python 做數據科學,必須學習很多不在基礎 Python 中的材料,例如 NumPy、Pandas 和 matplotlib。
相比之下,矩陣類型和基本圖形已經內置於基礎 R,新手可以在幾分鐘內完成簡單的數據分析。
即使對於精通系統的人來說,Python 庫也很難配置,而大多數 R 軟體包都是開箱即用的。
R 輕微取勝。
CRAN 擁有超過 14,000 個包。PyPI 的包則多於 183,000 個,不過在數據科學方面看起來似乎比較薄弱。
Matloff 舉了一個例子:他曾經需要代碼來快速計算給定數據點的最近相鄰,在 CRAN 中能夠立即找到不止一個包來執行此操作。而在 PyPi 中粗略搜索後空手而歸。
他還指出在 PyPI 中進行以下搜索沒有任何結果:EM 算法;對數線性模型;泊松回歸;工具變量;空間數據;整體錯誤率等等。
「這並不是說這些東西不存在 Python 庫。只是在 PyPI 中不容易找到它們,而在 CRAN 中很容易找到。」
事實上,R 具有規範的封裝結構是一個很大的優勢。 安裝新軟體包時,確切地知道會出現什麼。 類似地,R 的泛型函數對於 R 來說也是一大的優勢。當使用新的包時,人們知道自己可以使用 print()、plot()、summary() 等,所有這些都構成了包的「通用語言」。
Python 略微勝出。
R vs. Python 辯論主要是統計與 CS 的爭論,由於神經網絡的大多數研究來自 CS,因此 NN(Neural Network,神經網絡) 的可用軟體主要是 Python。 RStudio 在開發 Keras 實現方面做了一些出色的工作,但目前為止,R 在這個領域受到限制。
另一方面,隨機森林研究(random forest research)主要由統計界進行,在這個領域 R 更具優越性。R 還具有優異的梯度增強封裝。
這裡 Python 略勝一籌,因為對很多人來說,機器學習就意味著神經網絡。
R 贏得大勝。
Matloff 表示 「R 是由統計學家為統計學家編寫的」。他發現「那些主要使用 Python 進行機器學習的人往往對其中的統計問題缺乏了解,甚至不屑一顧」。
雙方打成平手。
R 和 Python 的基礎版本都不能很好地支持多核計算。 Python 中的線程很適合 I/O,但由於臭名昭著的 Global Interpreter Lock,使用它們進行多核計算是不可能的。 Python 的多處理軟體包和 R 的「並行」軟體包都不是好的解決方法。 支持集群計算的外部庫在兩種語言中都 OK。
目前,Python 具有更好的 GPU 接口。
R 略勝一籌。
雖然有 SWIG 等工具可以將 Python 連接到 C/C++,但目前沒有像 R 的 Rcpp 那樣強大的功能。Pybind11 軟體包正在開發中。
此外,R 的新 ALTREP 理念在提高性能和可用性方面具有巨大潛力。
另一方面,Python 的 Cython 和 PyPy 變體在某些情況下可以預先消除對顯式 C/C++ 接口的需求。確實有人會說 Cython 是一個 C/C++ 接口。
依然是 R 略勝一籌。
舉例來說,儘管函數在兩種語言中都可作為對象,但 R 比 Python 更進一步。Matloff 說每當自己使用 Python 工作時,都會因為無法直接將函數輸入到終端或編輯它而感到惱火,但在 R 上就可以這樣做。
Python 只有一個 OOP 範例。在 R 中,可以選擇幾種(S3、S4、R6 等),不過也有些人可能會爭論這是否是一件好事。
R 有神奇的元編程特性(產生代碼的代碼),但是大多數 CS 人都沒有意識到它。
R 損失巨大。
Python 目前正在從 2.7 版過渡到 3.x 版,這會導致一些中斷,但不至於太複雜。
相比之下,R 正迅速轉變為兩種相互無法理解的語言,即普通的 R 和 Tidyverse。 作為一名經驗豐富的 R 程式設計師,Matloff 表示自己無法閱讀 Tidy 代碼,因為它調用了許多他不知道的 Tidyverse 函數。也有網友評論說「人們可以在對 R 沒什麼了解的情況下,在 Tidyverse 中進行編碼」。
Python 獲勝。
經典計算機科學數據結構,例如二叉樹,很容易在 Python 中實現。它不是基礎 R 的一部分,但可以以各種方式完成,例如數據結構包,它包含了使用廣泛的 Boost C++ 庫。
R 大獲勝。
首先,R 的基本 help() 函數比 Python 的信息量大得多。它很好地補充了 example()。最重要的是,在 R 包中能夠編寫 vignette(通過函數 vignette() 返回,一般是 PDF 格式的實用介紹性文章)使 R 在這方面成為了一個不折不扣的贏家。
RStudio 開發的 reticulate 包能夠在 R 上運行 Python,可以作為 Python 和 R 之間的橋梁,適用於純計算。 但它並沒有解決 Python 中出現的棘手問題,例如虛擬環境等。
目前,Matloff 不建議編寫混合的 Python/R 代碼。
分析了這麼多,最後當然還是要根據實際需求來進行選擇,畢竟語言之間沒有孰優孰劣。
原文:https://github.com/matloff/R-vs.-Python-for-Data-Science