當前位置:
首頁 > 知識 > 全面對比 MATLAB、Julia、Python,誰在科學計算中更勝一籌?

全面對比 MATLAB、Julia、Python,誰在科學計算中更勝一籌?

全面對比 MATLAB、Julia、Python,誰在科學計算中更勝一籌?

數百種編程語言,各有優劣,各自也都有自己最為適用的場景。那麼就科學計算領域而言,主流的 MATLAB、Julia、Python 會有哪些最為獨特的優勢呢?又存在哪些讓開發者無力的缺陷?在本文中,我們將對三者進行全面對比與解析,探索科學計算各個場景中最佳的編程語言。

全面對比 MATLAB、Julia、Python,誰在科學計算中更勝一籌?

作者 | Toby Driscoll

譯者 | 槐序,責編 | 屠敏

出品 | CSDN(ID:CSDNnews)

以下為譯文:

我使用MATLAB已經超過25年了。(在此之前,我甚至使用了MATRIXx,一個末期的,不值得嘗試的分支,或者可能是一個噱頭)這不是我學習編程的第一種語言,但是憑藉它我進入數學方法時代,了解MATLAB對我的職業生涯非常有益。

但是,Python的興起在科學計算中已經不可忽視。MathWorks一定有相同的感覺:它們不僅增加了在MATLAB中直接調用Python的能力,而且還採用了一些語言特性,例如對二元運算符的操作進行更積極廣播。

這已經達到了我一直質疑我在研究和教學中繼續使用MATLAB的程度。雖然大部分對我來說很容易,而且為此我投入了很多精力,但是很難鼓起勇氣去真正學習新的東西。

我編寫過基於MATLAB的教科書(可作入門計算數學參考書)。這本書有超過40個函數和160個計算實例,它涵蓋了我認為使用MATLAB進行數值科學計算的全面基礎。部分是為了自我提升,部分是為了為了增加這本書的實用性。我今年開始將代碼翻譯成Julia和Python。這一經歷使我對關於科學計算方面的三種語言有特殊的看法,這就是下面我試圖討論的。

我將主要討論成本和開放性問題。與Python和Julia不同的是,MATLAB既無啤酒自由也無言論自由。這對於某些人來說,的確是個巨大的區別,決定性的區別——但是我想考慮技術優勢。多年來,MATLAB以許多非常有用的方式遠遠超過了其他任何免費產品,如果你想提高工作效率,那麼成本就會受到損害。這是對語言的理想訴求和語言生態的單獨考慮。

當你把成本放一邊時,這些語言之間有著許多差異的有用框架在於它們的起源。MATLAB是最早嘗試優先考慮數學,尤其是數字導向數學。Python在20世界80年代末開始認真,它以計算機科學為中心重點。Julia從2009年開始在這些方面尋求更多的平衡。

全面對比 MATLAB、Julia、Python,誰在科學計算中更勝一籌?

MATLAB

最初,MATLAB中的每個值都是雙精度浮點數數組。這個選擇的兩個方面,數組和浮點數,都受到設計決策的啟發。

用於浮點數的IEEE 754標準直到1985年才被採用,且內存是用K而不是G來度量的。浮點雙精度並不是表示字元或整數最有效的方式,但是它們是科學家、工程師以及越來越多的數學家大多數時候想要使用的。此外,不必聲明變數,也不必顯式分配內存。讓計算機來處理這些任務,並將數據類型拋到一邊,解放你得大腦去思考對數據進行操作的演算法。

數組之所以重要,是因為線性代數中的數值演算法正以LINPACK和EISPACK的形式出現在自己的數組中。但是科學計算中的標準承載器FORTRAN 77在涉及到變數聲明、調用隱式命名的程序、編譯代碼,然後檢查數據和輸出文件方面是多步驟的過程。將矩陣乘法寫為A*B並立即列印出答案是改變遊戲規則的人。

MATLAB還使圖形變得簡單且易於訪問。沒有複雜的特定於機器的低級調用庫,僅僅只需要plot(x,y),你幾乎就能看到其他任何使用MATLAB的人都會看到的。MATLAB還有很多創新,例如複雜數字,稀疏矩陣,構建跨平台圖形用戶界面的工具,以及一套領先的ODE解算器套件,這些使得MATLAB成為以思維速度進行科學計算的地方。

然而,對於互動式計算而言,理想的設計,即使是冗長的計算,並不總是有助於編寫良好的高性能的軟體。在許多函數之間移動數據需要處理大量的變數,並需要頻繁查閱有關輸入和輸出參數的文檔。平面命名空間中的每個磁碟文件的一個功能對於一個小項目來說非常簡單,但是對於大型項目來說卻是一個令人頭痛的問題。如果你想避免速度瓶頸,則必須應用某些編程模式(矢量化,內存預分配)。科學計算現在被應用於更多的領域,擁有大量不同的本地數據類型。等等。

MathWorks通過繼續在MATLAB中進行創新來做出回應:內聯函數,嵌套函數,變數閉包,多數據類型,面向對象的特性,單元測試框架等等。每項創新都可能是解決一個重要問題的方法。但是40年改變的積累卻產生了破壞簡單性和統一性概念的副作用。在2009年,我寫了一本書,在不到100頁的篇幅里,很好地涵蓋了我認為MATLAB的基本內容。據我所知,所有這些依然可用,但是現在你需要了解更多才能稱自己是精通的。

全面對比 MATLAB、Julia、Python,誰在科學計算中更勝一籌?

Python

從某種意義上講,Python的歷史來幾乎是MATLAB的鏡像,兩者都具有互動式命令行(現在被廣泛稱為REPL,即「real-eval-print loop」),並且不受變數聲明和編譯的限制。但是MATLAB是作為數值分析師的遊樂場而創建的,而Python則是考慮黑客的情況下創建的。然後通過修訂和擴展,每個都向其他受眾發展。

在我看來,Python仍然缺少數學吸引力。你有一些尷尬和小煩惱,例如對於矩陣乘法用**替換^和@(最近的一項創新),一個shape而不是矩陣大小,面向行存儲等。如果你認為

V.conj.T@D**3@V是一個優雅的寫作方式來書寫V?D3V,那麼你可能需要看醫生。還有零索引(即與從1開始的索引相反)。我讀過這些論點,我認為它們不具有決定性。這顯然是一個偏好的問題——網路聖戰的內容——因為你可以舉出笨拙的例子來說明任何一種約定。我發現決定性的是,我們有數十年的數學實踐索引向量和矩陣,大量偽代碼做出了這個假設。

除了這些小煩惱外,我發現Python+NumPy+SciPy生態系統既笨拙且不一致。儘管語言主要用於面向對象,但存在一個矩陣類,但它的使用並不鼓勵且被棄用。也許MATLAB使我墮落,但是我發現矩陣是一個非常重要的對象類型,可以幫助和提升。OOP的主要賣點不就是你可以用*來對數組和矩陣能做不同的事嗎?在這方面還有許多不足之處。(為什麼我需要一個名為spsovle的命令?我不能在稀疏矩陣上調用solve解決嗎?然後繼續)。

對我來說,有些地方的數字生態系統看起來有點薄弱。例如,正交和ODE(常微分方程)解法在2019年看起來像一個最小集合。AFAICT沒有方法來解決DAEs,DDEs,沒有辛解法,也不允許內部Krylon迭代的隱式計算方法。看看這些方法的參考資料,它們大多30歲或者更老——仍然很好,但是距離完成還很遠。Matplotlib包是一個了不起的工作,有一段時間它看起來比MATLAB好,但是發現它仍然缺少3D。

一些專家認為,對於Python代碼在執行速度上很難跟上編譯性語言,有著深層次原因。我對搜索「python太慢了」的結果感到很開心,Python的擁護者做了很多以前MATLAB做過相同的爭論和道歉,這並不意味著他們錯了,但也不僅僅是感知問題。

我想我明白為什麼Python對科學計算領域的許多人來說都是如此令人興奮。它有一些MATLAB風格式的語法和功能,可以從REPL獲得。它周圍有很好的工具,可以很好地與其他語言以及計算領域配合使用。它免費且具有更好的長期可復用性。很明顯,它適用於很多可能沒有什麼理由去改變的人。

但是對於我知道如何在科學計算中做的事情來說,Python比我習慣的更像一項學習和使用的苦差事。我們暫時還不知道它是否會繼續席捲整個社區,或者已經接近頂峰。我沒有特殊的預測能力,但我對它未來看跌。

全面對比 MATLAB、Julia、Python,誰在科學計算中更勝一籌?

Julia

Julia有後來者其優點和缺點。我讚賞Julia的創作者認為他們可以做得更好:


我們想要一種具有自由許可的開源語言。希望擁有C的速度和Ruby的靈活。我們想要一種同像性語言,有像Lisp這樣真正的宏,而又有MATLAB般淺顯熟悉的數學符號;我們想要一門像Python一樣可用於通用編程、像R般在統計分析上得心應手、像Perl般自然地處理字元串、像MATLAB般具有強大的線性代數運算能力、像shell般擅長將程序粘合在一起的語言。它簡單易學,卻又讓嚴苛的黑客為之傾心;還有,我們希望它是互動式的,同時具備可編譯性。

在很大程度上,我相信他們已經取得成功了。在1.0版本的後期,他們似乎稍微淡化了REPL,並且有一些無理由的慢慢遠離MATLAB。(LinRange究竟比linspace更好嗎?)然而,這些都是狡辯。

這是我使用的第一種超越ASCII的語言。通過使用像?的變數,和≈的操作符,我仍然得不到合理的滿足感。它不僅僅是表面的;能夠看起來像我們寫的數學表達式是其真正的優勢,儘管他確實會使教學和文檔變得有點複雜。

使用Julia工作讓我覺得我養成了一些編程習慣,是因為MATLAB的選擇,而非內在的優越性。矢量化對於許多事情並不自然。在Julia中發現,只要在函數名加一個點,你就可以對任何函數矢量化,這一點令人大開眼界。通過訓練構造矩陣,相比之下,使得嵌套循環(或meshgrid技巧)看起來像是馬車鞭子,並且通過生成器完全避免矩陣來進行簡單的求和,感覺像沒有付出代價就到手了。(我知道Python有類似的語言特性)。

多重派發這一大特性使得某些事情比面向對象做更容易和清晰,例如,假設你有傳統面向對象語言中的Wall和Ball類,那個類會檢測Ball和Wall之間的衝突?或者你需要一個Room類來充當裁判?這類問題讓我心煩意亂。使用多重派發,數據被打包到對象類型中,但是對數據進行操作的方法不會綁定到類。因此:

function detect_collision(B::Ball,W::Wall)

了解類型,但是他們是獨立定義, 對我來說,需要花費大量的編程來理解多重派發的概念對於擴展語言是多麼有趣和潛在的重要性。

數字生態系統一直在迅速發展。我的第一個例子是DifferentialEquations.jl,由令人驚嘆的Chris Rackauckas編寫。如果這個軟體不能馬上贏得Wilkinson獎,那麼系統就會崩潰。只需要去網站準備轉換。

我還沒有看到Julia承諾的高於MATLAB的速度提升。部分原因是我相對缺乏經驗和我所做的任務,但部分原因在於MathWorks在自動化代碼方面做了令人難以置信的工作。不管怎樣,這不是我在大部分時間關注的編碼方面。

使用Julia編程花了一段時間之後才讓我感到舒服(也許只是我變老了或者固化了)。它讓我對數據類型的思考超出我的想像,而且總是潛在懷疑我錯過了做某件事的正確方式。但是日常使用中,我現在幾乎可以轉向Julia,作為MATLAB使用。

全面對比 MATLAB、Julia、Python,誰在科學計算中更勝一籌?

總而言之

MATLAB是企業解決方案,尤其適用於工程。對於基本數字任務它可能仍然是最容易學習的。細緻的文檔和數十年貢獻的學習工具絕對重要。

MATLAB是科學計算界的寶馬轎車。它是昂貴的,那是在你開始談配件(工具箱)之前。你要為一個堅如磐石,平穩的性能和服務買單。它也會吸引了不成比例的仇恨。

Python是福特的皮卡。它無處不在,深受許多人(在美國)的喜愛。它可以做任何你想做的事,而且它是為做一些其他車輛不能做的事情而設計的。可能你會時不時想借一輛,但它並沒有提供非常純粹的駕駛體驗。

Julia是特斯拉,它是以改變未來這一膽大目標而建立,它可能會。它也可能只是一個腳註,但與此同時,你將成功地得到你想要的,並有餘力。

全面對比 MATLAB、Julia、Python,誰在科學計算中更勝一籌?

你怎麼看?

@Hprotagonist:

就我個人而言,MATLAB在涉及到除了那翻轉大矩陣之外,都徹底地讓我受不了。作為線性代數特定領域工具,我當然更喜歡它而不是R,但是作為一個通用工具,它讓我想拔出自己的牙齒。

它的設計並不是為了製造可維護、易於測試和易於重構的流水線工具,而從未如此,它能處理類似「簡單明確的字元串和路徑操作」這些基本事情,充其量是一個奇怪的仿C、Fortan、Java,且當其他任何語言當增加這些特性都會風靡一時。

我對MATLAB技術內容或多或少有一點煩惱。(我能忍受一個索引):

size([1])
ans = [1 1]

這完全是錯誤的,而numpy是正確的:

In[0] np.array([1]).shape Out[0] (1,)

Python實際上是一種通用語言,具有成熟的科學堆棧,使用它的數值計算我感覺更安全,因為我可以有一個強大的測試套件和命令行輸入指向我的代碼,這增加了我對我的代碼正在做我認為應該做的事的信心,使其易於使用。

打包或多或少是一次硬幣翻轉,Python打包是一個巨大的錯誤;matlab是不存在的(你必須自己提供每個依賴項)並且價格昂貴(其用戶必須為其使用的工具箱付費,以及/或者安裝MCR,且不能編輯代碼)。

必要時我會維護matlab,但是我不太喜歡它。

@nimrody:

我喜歡MATLAB的一個特性是其函數是函數。參數是按值傳遞的,函數無法修改其參數(嗯,除了可能不常見的對象)。

如果函數不能修改其參數,Matlab將嘗試優化並避免複製。Matlab(有時)也足夠聰明,因此A=f(A)會在適當的位置修改A而不是複製。

這就是我對於數學導向語言的期望。如果可能的話,保持引用透明的假象,然後在內部進行優化。

MATLAB也有合理的JIT編譯器,一個很好的調試器。

我不再使用MATLAB,但是它是科學計算(模擬,探索)的一個非常高效的環境。

@ggcdn:

MATLAB有它的獨特,但我從來沒有遇到過更好的IDE來調試「科學」代碼或腳本。通過將滑鼠懸停在變數上來查看當前值,能夠暫停和執行某些「測試」代碼,或者重寫代碼並繼續執行,能夠輕鬆編輯類似excel表中的數組或矩陣,當寫成代碼時,有看起來不像狗屎一樣矩陣演算法...這些是我認為非常有用的東西。我僅僅因為這些原因在我的領域(結構工程)中使用它,即使它可能會比較慢,或者更難以完成某些任務。

@ohsonice:

我的(數學研究生院)觀點:

出於多種原因,MATLAB在學術界受到推崇。很容易生成可讀的小腳本作為課堂示例。調試功能/IDE易於導航。學校支付許可費;編譯或下載包沒有任何開銷工作(除非你想要做一些炫酷的)。

我參加了用Python教授的ML課程。我所有的數值分析和建模課程都依賴MATLAB於來做示例和作業。我(作為一個數學界之外的程序員)選擇Julia進行研究。現在我做更多的理論研究,因為我不喜歡混合編碼和運算。

一位同學,在FORTRAN平台開發PDE解算器,導師告訴他先讓其在MATLAB中工作,然後再轉向更快的語言。

原文:https://tobydriscoll.net/blog/matlab-vs.-julia-vs.-python/

本文為 CSDN 翻譯,轉載請註明來源出處。

【End】

全面對比 MATLAB、Julia、Python,誰在科學計算中更勝一籌?

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 CSDN 的精彩文章:

少林寺步入 5G 時代
首款搭載國產CPU的域名伺服器發布;iPhone徹底淘汰Lightning介面?ChromeOS 75發布 | 極客頭條

TAG:CSDN |