【周則禹的回答(160票)】: 錯別字比較多,請諒解~ 總的概括:R主要在學(xué)術(shù)界流行,python(numpy scipy)在工程方便比較實用。 R是S(Splus)的開源版本,或者下一代。發(fā)源地在新西蘭奧克蘭。這個軟件的統(tǒng)計背景很濃烈。我這里濃烈的意思是,如果你不熟習(xí)統(tǒng)計知識(歷史)的話,R的幫助文檔看起來是很累的。由統(tǒng)計背景的人開發(fā)。R的維護組叫CRAN-R。在生物信息方便,有個叫bioconductor的組織,里面有很多生物信息方面可以用的軟件包,他們有一套自己維護package系統(tǒng)。 Python是個綜合語言(這里特指指CPython解釋器),numpy scipy是數(shù)值計算的擴展包,pandas是主要用來做數(shù)據(jù)處理(numpy依賴),sympy做符號計算(類似mathematica?)此外還有一些不太成熟的包如sciki learn,statistical models。成熟度不如R。但是已經(jīng)到了可用的水平了。是讀計算機的人寫的統(tǒng)計包。ipython 更新到1.0以后,功能基本完善,其notebook非常強大(感覺就像mathematica)而且還是基于web,在合作分享方面非常好用。 性能: 大家都說R慢,特別是CS的人。其實這里主要是兩點:一個R里面數(shù)組的調(diào)用都是用復(fù)制的,二是Rscript慢。三是處理大數(shù)據(jù)慢。如果R用的好的話,R是不太慢的。具體來說就是Rscript用的少,多用命令,跑點小數(shù)據(jù)。這樣的話,實際在跑的都是背后的fortran和C庫。他們都有快二三十年歷史了??芍^異??煽浚瑑?yōu)化得不能再優(yōu)化了(指單線程,如果去看源代碼揮發(fā)先許多莫名的常數(shù),永用了以后精度高速度快?。?。比如一個自己編寫一個R腳本,loop套loop的那種,那真是想死的心都會有。外加一點,R處理文本文件很慢! Python歸根揭底還是個有解釋器的腳本語言,而且有致命傷——GIL,但python最難能可貴的就是它很容易變得更快。比如pypy,cython,或者直接ctypes掛C庫。純python寫個原型,然后就開是不斷的profiling和加速吧。很輕易可以達到和C一個數(shù)量級的速度,但是寫程序、調(diào)試的時間少了很多。 并行計算: R v15 之后有了自帶的parallel包,用挺輕松的。不過其實就是不停的fork,或者mpi,內(nèi)存消耗挺厲害的。parSapply,parApply什么的,真是很好用。 Python雖然有GIL——并行計算的死敵,但是有multiprocessing(fork依賴) ,是可以共享數(shù)據(jù)的什么的,估計內(nèi)存消耗方面比R好點,數(shù)據(jù)零散的話overhead很多。到了MPI的話,mpi4py還是挺好用的。用cython的話結(jié)合openmp可以打破GIL,但是過程中不能調(diào)用python的對象。 學(xué)習(xí)曲線:假設(shè)什么編程都不會的同學(xué)。 R一開始還是很容易上手的,查到基本的命令,包,直接print一下就有結(jié)果了。但是如果要自己寫算法、優(yōu)化性能的時候,學(xué)習(xí)難度陡增。 Python么,挺好學(xué)的,絕大多數(shù)的幫助文檔都比R好了許多。有些包用起來沒R方便??偟膩碚f深入吼R陡。 擴展資源: 基本上新的統(tǒng)計方法都會有R的package,安裝實用都不麻煩。但是基本上都是搞統(tǒng)計的人寫的計算機包。所以效能上可能有問好。比較出名的有兩個包的管理網(wǎng)站,cran-r 和bioconductor。 所以搞生化的估計R用起來很方便。 python的統(tǒng)計計算包們比R少,多很年輕,還在不斷的開發(fā)中。優(yōu)于是計算機人寫的統(tǒng)計包,用起來的時候要多漲個心眼。 畫圖: R自帶的那些工具就挺好用了,然后還有g(shù)gplot這種非常優(yōu)美的得力工具。 python 有matplotlib,畫出來效果感覺比R自帶的好一些些,而且界面基于QT,跨平臺支持。可能是R用得多了,pyplot用起來還是不太順手,覺得其各個組建的統(tǒng)一性不高。 IDE: Rstudio非常不錯,提供類matlab環(huán)境。(本人過去用vim-r-plugin,現(xiàn)在用emacs + ess。) windows 下有python(x,y) 還有許多商業(yè)的工具。(本人現(xiàn)在的emacs環(huán)境還不是很順手~) 建議: 如果只是處理(?。?shù)據(jù)的,用R。結(jié)果更可靠,速度可以接受,上手方便,多有現(xiàn)成的命令、程序可以用。 要自己搞個算法、處理大數(shù)據(jù)、計算量大的,用python。開發(fā)效率高,一切盡在掌握。 ps:盲目地用R的包比盲目的地用python的包要更安全。起碼R會把你指向一篇論文,而python只是指向一堆代碼。R出問題了還有論文作者、審稿人陪葬。 題外話,個人經(jīng)驗:
【知乎用戶的回答(41票)】: 的確,如同@周則禹 在回答中說到的,R是統(tǒng)計學(xué)家的東西。 統(tǒng)計學(xué)家是一種什么生物呢? “哈希表?二叉樹?鏈表?這是啥,可以吃嗎?” “循環(huán)?遞歸?沒學(xué)過,不會!” 所以,在R中沒有我們在計算機課上學(xué)的各種數(shù)據(jù)結(jié)構(gòu)(至少不安裝擴展包就沒有)。如果你寫的代碼中還用循環(huán)來處理數(shù)據(jù),而不是用apply、aggregate之類的函數(shù),那么在R圈里會被人嘲笑。如果你的思維還是無法從計算機編程習(xí)慣中切換到R的話,那么還是用Python吧。 也是由于上述問題,R完全沒有考慮內(nèi)存優(yōu)化和算法加速之類的問題(R中不會關(guān)心sort函數(shù)是用快排還是冒泡實現(xiàn)的),所以數(shù)據(jù)量一大,計算機的內(nèi)存就被占光了。不過有關(guān)內(nèi)存和加速的問題已經(jīng)有了許多的解決方案,例如用ICC編譯R源代碼鏈接MKL加速R數(shù)值計算,使用擴展包實現(xiàn)內(nèi)存映射硬盤,等等。這些對于一個經(jīng)驗豐富的碼農(nóng)來說完全不在話下。所以,決定使用R還是Python的關(guān)鍵,就是你是否能夠接受R的思想。 在R中,沒有變量,只有數(shù)據(jù)! 沒有循環(huán),只有批處理! 沒有計算機算法,只有數(shù)學(xué)模型! 如果決定使用R,那么就必須將自己從數(shù)據(jù)結(jié)構(gòu),算法策略這些知識中解脫出來。一個函數(shù)就是一個數(shù)學(xué)模型(回歸、假設(shè)檢驗、方差估計),用統(tǒng)計和概率的思路去理解數(shù)據(jù)挖掘和機器學(xué)習(xí)的算法。使用R,能夠?qū)⒐ぷ髡邚牧?xí)慣的算法中解脫出來,真正去思考模型本身的數(shù)學(xué)意義,在數(shù)學(xué)層面去修改算法。忘記我們經(jīng)常思考的算法復(fù)雜度和內(nèi)存消耗之類的問題,推動機器學(xué)習(xí)和數(shù)據(jù)挖掘的關(guān)鍵動力,就是數(shù)學(xué)模型! 最后總結(jié)一下: R能夠用最短的代碼實現(xiàn)一個新的統(tǒng)計模型和機器學(xué)習(xí)模型(前提是對R和擴展庫很熟悉),并且每一句代碼都有對應(yīng)的數(shù)據(jù)和數(shù)學(xué)意義;因此R適用與建立新模型,新算法,并且對模型進行統(tǒng)計意義的評價。 Python能夠讓程序員在盡量不受語言細節(jié)的干擾下,將一個已經(jīng)證明成熟和可靠的算法實現(xiàn)出來,并且投入工程應(yīng)用,開發(fā)出實用的決策系統(tǒng)。 對語言的選擇其實也是程序員對自我的定位: 是想做科學(xué)家,還是工程師。 【過擬合的回答(14票)】: 根據(jù)我的使用經(jīng)驗,我認(rèn)為一般性的科研可以使用numpy工具鏈做為主力。 首先,在寫矩陣計算相關(guān)的語句時,numpy的語法幾乎能逼近MATLAB的簡潔程度,而其他語言相對來說稍微“難看、難寫”一些。 其次,當(dāng)程序不僅僅涉及到科學(xué)計算時,用Python就可以大發(fā)神威了。比如我自己遇到的一個實際問題:需要對點云進行一些非常復(fù)雜的優(yōu)化操作,之后需要畫出三維圖且支持一些拉近拉遠轉(zhuǎn)視角的操作,并且還要做出一個不錯的界面方便調(diào)整參數(shù)、載入數(shù)據(jù)等等??吹疆嬋S點云的第一反應(yīng)就是用OpenGL,但是使用C/C++寫那些非常繁雜的數(shù)值優(yōu)化...用MATLAB可以很舒服、很便捷地寫出優(yōu)化部分的代碼,但是直接畫大規(guī)模的三維點云的速度,以及它那令人憂傷的GUI... 那Python就行嗎?是的。在數(shù)值計算方面,Numpy/Scipy,以及強大的機器學(xué)習(xí)包scikit.learn,讓這個過程十分愜意。在畫三維點云方面,PyOpengl包完全就是OpenGL的Python封裝,速度非???,而且語法幾乎同OpenGL一樣。最后,使用PyQt寫出基于Qt的GUI,這至少是一個標(biāo)準(zhǔn)的完備的GUI包,外觀功能都不錯。最后的最后,這個程序不需改動就可以跨平臺運行,只要Linux/Windows用戶按照標(biāo)準(zhǔn)過程安裝了相應(yīng)的包就可以使用,不用折騰本地編譯之類的事情。 還有一個問題是速度。Windows下使用python(x,y)、Linux下源里默認(rèn)安裝方法的Python鏈接的都是較慢的Blas/Lapack庫,而MATLAB默認(rèn)鏈接MKL,所以矩陣計算速度會慢非常多。但是至少在Linux下是很容易讓Numpy鏈接上MKL的,這樣的Numpy計算速度與MATLAB幾乎相同,所以速度不是嚴(yán)重的問題。也許C++能在循環(huán)上秒殺Python,但是如果你涉及到矩陣計算,用的普通的BLAS/LAPACK庫,那么在核心的某幾步上會慢成渣,從而在總的速度上被Python超越,得不償失。當(dāng)然你也可以讓C++程序鏈接上MKL庫,但要移植到別的平臺又是一番折騰。 最后就是開發(fā)環(huán)境,個人推薦Eclipse的Pydev,用起來幾乎同MATLAB一樣,尤其是調(diào)試和看變量值方面。 在統(tǒng)計問題方面,用R寫起來最舒服,因為包全,這一點Python或者C比不上。而且R也能鏈接MKL大大加快速度。還有就是,如果你要寫統(tǒng)計方面的論文,那論文里的代碼用R似乎會“顯得”你更“ 專業(yè)”一些。 上學(xué)期有流形學(xué)習(xí)課,我用scikit.learn包,幾乎每次只改一句話就能提交作業(yè)(把LLE變成ISOMAP什么的)。還有一門統(tǒng)計學(xué)習(xí)課,讓我深刻感覺到R就是用來寫老師布置的ESL后面的那些編程題的,因為那些方法的作者,以及這本書的作者,寫的就是R的包。至于大規(guī)模計算、實際的大型工程問題,我沒有經(jīng)驗,所以不能提供更多信息了。 補充:如果覺得自己鏈接MKL庫編譯Numpy和R麻煩的話,Python可以使用Canopy(就是之前的EPD),R可以使用Revolution R,都是一些商業(yè)公司幫配置好的完整發(fā)行版,鏈接了MKL庫并支持其他一些特性(例如自帶IDE等)。前者各平臺都有,后者僅限Windows平臺。 再補充:之前我寫過兩篇博文講鏈接MKL庫的方法。NumPy鏈接MKL請見Numpy使用MKL庫提升計算性能,R鏈接MKL請見R鏈接MKL庫以顯著提升計算速度。 【知乎用戶的回答(7票)】: R為比較高等級的語言,R和python, C如今可以進行無縫連接。所以我覺得應(yīng)該各取其長,用R把python和C連接好,取長補短,不被單一語言限制,才能迎接各種困難。 【肖楠的回答(7票)】: 個人現(xiàn)狀:使用 R,學(xué)習(xí) Python,關(guān)注 Julia。 【茉茉的回答(3票)】: R。如有可能再接觸下 SAS 更好。 【肖龍飛的回答(2票)】: 如果做數(shù)據(jù)分析師,那么R就夠用了,R中有很多現(xiàn)成的統(tǒng)計、數(shù)據(jù)挖掘的工具包; 如果是程序員,可以學(xué)python,用來做一般化編程python更合適些。 Python (programming language): What are the advantages of using Python over R? 【reverland的回答(2票)】: 先接觸R,學(xué)習(xí)過程就一個蛋疼。后來開始python,從入門開始相比R一路順手到不行。python不僅僅作為計算而開發(fā),數(shù)據(jù)分析統(tǒng)計往往又要涉及很多非計算的東西,當(dāng)時覺得腳本語言做這些亂七八糟的事真方便。 但這回頭開始深入R之后,發(fā)現(xiàn)R rocks too,R是個很專注的環(huán)境,現(xiàn)成的東西太多了。 就國內(nèi)而言,覺得R的社區(qū)比python科學(xué)計算社區(qū)活躍很多,兩者風(fēng)格也迥異(感覺一個大部分是折騰數(shù)據(jù)的一個簡直都是折騰程序的)。 所以,不是為了寫程序就R吧 【克林的回答(2票)】: 我也希望能只選一個而放棄另一個,但是在實際工作中,做不到。 R有著獨一無二神一樣的的ggplot(只是效率太低,希望dplyr發(fā)布后作者能夠用它重構(gòu)ggplot里的數(shù)據(jù)處理部分,取代plyr),還有data.table (它的語法實在是太精簡了)。當(dāng)然,R最顯著的特點就是其語言特性支持超高的信噪比(這里特指數(shù)據(jù)整潔、分析時,其他時候相反?。?,同樣的功能在R里所占據(jù)的字符數(shù)比在Python里少了一半以上。比如
但是,有時候,你需要自己寫一些復(fù)雜的程序,或者調(diào)用一些外部的C, python代碼,這個時候就Python 就顯示出優(yōu)勢來了。用R寫程序極其令人煩躁(很多代碼都是為了做些不相干的事情,比如在一個正確的frame里獲取一個object的名字 --> 為了能夠在使用的時候保持高信噪比,我多次深陷quote, substitute, eval, parent.frame里不能自拔),同時效率也不高(除非你用Rcpp)。 【吳告于的回答(1票)】: R會慢一些,pandas關(guān)鍵在于提供了兩個類dataframe和series,以及許多高層的實現(xiàn)特定功能的函數(shù)。具體看你做什么應(yīng)用。我比較偏向pandas。 【李作剛的回答(1票)】: 目前來看 : R 在統(tǒng)計方面做得非常好。是因為統(tǒng)計學(xué)領(lǐng)域長時間的積累,他又非常完善的各種統(tǒng)計學(xué) package。但在實際操作中,R 單獨是做不了事情的。 必須依賴Python 或者 Java 才能完成一個項目。 Python 可以方便的處理除了統(tǒng)計之外的其他事情。但統(tǒng)計這個短板繞不過。短期內(nèi)也很難達到 R 的成熟。 所以當(dāng)前的最好的是,用 R 來負(fù)責(zé)統(tǒng)計分析的核心環(huán)節(jié)。剩下的交給其他。 從長遠來看,如果 Python 能把R 擁有的所有的統(tǒng)計學(xué) package 重寫一遍。就沒 R 什么事情了。 【林春艾的回答(0票)】: 這個我也比較困惑,但現(xiàn)在想來,先學(xué)python相關(guān)的科學(xué)計算庫,這個學(xué)起來曲線平緩一點。 【知乎用戶的回答(0票)】: 嘗試過很多次R,但最終還是Python用著順手 【廢城院長的回答(0票)】: 牽扯到多個平臺間的計算 Python 容易點,如果數(shù)據(jù)都在一個平臺,R的library 更豐富些。當(dāng)然兩者也可以互相調(diào)用. 【CosmiaFu的回答(0票)】: 為什么不試試兩個都用呢? 就像C好還是Python好一樣,為什么不試試兩個一起用呢? 【林楓的回答(0票)】: 顯然 python numpy scipy pandas matplotlib R不適合集成 【Nextchen的回答(0票)】: 這個是在拉仇恨嗎?完全沒法比較,演變到最后,就成了程序派別之爭了!學(xué)習(xí)的話,兩個都無所謂。如果是生產(chǎn)環(huán)境,python 的性能自不必多說,R 近幾年在大數(shù)據(jù)方面也是有長足的進步,SparkR,mpi,hadoop 等等,而且 Google facebook twitter 這些巨頭也在關(guān)注 R。所以性能現(xiàn)在已經(jīng)不是 R 的弊端,像 dplyr 這類 R 的包出現(xiàn),單機的性能也能得到優(yōu)化。所以說,不用問,試試才知道哪個適合你? 【王雙洋的回答(0票)】: 既然題主說到 統(tǒng)計分析,那么我想應(yīng)該毫無爭議的選著R 【你知道我是張三的回答(0票)】: 玩學(xué)術(shù)理論什么的還是R,工程實踐還是python吧。。。。 原文地址:知乎 |
|