日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

全面对比 MATLAB、Julia、Python,谁在科学计算中更胜一筹?

發(fā)布時(shí)間:2025/5/22 python 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 全面对比 MATLAB、Julia、Python,谁在科学计算中更胜一筹? 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

  數(shù)百種編程語(yǔ)言,各有優(yōu)劣,各自也都有自己最為適用的場(chǎng)景。那么就科學(xué)計(jì)算領(lǐng)域而言,主流的 MATLAB、Julia、Python 會(huì)有哪些最為獨(dú)特的優(yōu)勢(shì)呢?又存在哪些讓開發(fā)者無(wú)力的缺陷?在本文中,我們將對(duì)三者進(jìn)行全面對(duì)比與解析,探索科學(xué)計(jì)算各個(gè)場(chǎng)景中最佳的編程語(yǔ)言。

 

  作者 |Toby Driscoll

  譯者 |槐序,責(zé)編 | 屠敏

  出品 | CSDN(ID:CSDNnews)

  以下為譯文:

  我使用MATLAB已經(jīng)超過25年了。(在此之前,我甚至使用了MATRIXx,一個(gè)末期的,不值得嘗試的分支,或者可能是一個(gè)噱頭)這不是我學(xué)習(xí)編程的第一種語(yǔ)言,但是憑借它我進(jìn)入數(shù)學(xué)方法時(shí)代,了解MATLAB對(duì)我的職業(yè)生涯非常有益。

  但是,Python的興起在科學(xué)計(jì)算中已經(jīng)不可忽視。MathWorks一定有相同的感覺:它們不僅增加了在MATLAB中直接調(diào)用Python的能力,而且還采用了一些語(yǔ)言特性,例如對(duì)二元運(yùn)算符的操作進(jìn)行更積極廣播。

  這已經(jīng)達(dá)到了我一直質(zhì)疑我在研究和教學(xué)中繼續(xù)使用MATLAB的程度。雖然大部分對(duì)我來(lái)說很容易,而且為此我投入了很多精力,但是很難鼓起勇氣去真正學(xué)習(xí)新的東西。

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

  我將主要討論成本和開放性問題。 與Python和Julia不同的是,MATLAB既無(wú)啤酒自由也無(wú)言論自由。這對(duì)于某些人來(lái)說,的確是個(gè)巨大的區(qū)別,決定性的區(qū)別——但是我想考慮技術(shù)優(yōu)勢(shì)。多年來(lái),MATLAB以許多非常有用的方式遠(yuǎn)遠(yuǎn)超過了其他任何免費(fèi)產(chǎn)品,如果你想提高工作效率,那么成本就會(huì)受到損害。這是對(duì)語(yǔ)言的理想訴求和語(yǔ)言生態(tài)的單獨(dú)考慮。

  當(dāng)你把成本放一邊時(shí),這些語(yǔ)言之間有著許多差異的有用框架在于它們的起源。MATLAB是最早嘗試優(yōu)先考慮數(shù)學(xué),尤其是數(shù)字導(dǎo)向數(shù)學(xué)。Python在20世界80年代末開始認(rèn)真,它以計(jì)算機(jī)科學(xué)為中心重點(diǎn)。Julia從2009年開始在這些方面尋求更多的平衡。

  MATLAB

  最初,MATLAB中的每個(gè)值都是雙精度浮點(diǎn)數(shù)數(shù)組。這個(gè)選擇的兩個(gè)方面,數(shù)組和浮點(diǎn)數(shù),都受到設(shè)計(jì)決策的啟發(fā)。

  用于浮點(diǎn)數(shù)的IEEE 754標(biāo)準(zhǔn)直到1985年才被采用,且內(nèi)存是用K而不是G來(lái)度量的。浮點(diǎn)雙精度并不是表示字符或整數(shù)最有效的方式,但是它們是科學(xué)家、工程師以及越來(lái)越多的數(shù)學(xué)家大多數(shù)時(shí)候想要使用的。此外,不必聲明變量,也不必顯式分配內(nèi)存。讓計(jì)算機(jī)來(lái)處理這些任務(wù),并將數(shù)據(jù)類型拋到一邊,解放你得大腦去思考對(duì)數(shù)據(jù)進(jìn)行操作的算法。

  數(shù)組之所以重要,是因?yàn)榫€性代數(shù)中的數(shù)值算法正以LINPACK和EISPACK的形式出現(xiàn)在自己的數(shù)組中。但是科學(xué)計(jì)算中的標(biāo)準(zhǔn)承載器FORTRAN 77在涉及到變量聲明、調(diào)用隱式命名的程序、編譯代碼,然后檢查數(shù)據(jù)和輸出文件方面是多步驟的過程。將矩陣乘法寫為A*B并立即打印出答案是改變游戲規(guī)則的人。

  MATLAB還使圖形變得簡(jiǎn)單且易于訪問。沒有復(fù)雜的特定于機(jī)器的低級(jí)調(diào)用庫(kù),僅僅只需要plot(x,y),你幾乎就能看到其他任何使用MATLAB的人都會(huì)看到的。MATLAB還有很多創(chuàng)新,例如復(fù)雜數(shù)字,稀疏矩陣,構(gòu)建跨平臺(tái)圖形用戶界面的工具,以及一套領(lǐng)先的ODE解算器套件,這些使得MATLAB成為以思維速度進(jìn)行科學(xué)計(jì)算的地方。

  然而,對(duì)于交互式計(jì)算而言,理想的設(shè)計(jì),即使是冗長(zhǎng)的計(jì)算,并不總是有助于編寫良好的高性能的軟件。在許多函數(shù)之間移動(dòng)數(shù)據(jù)需要處理大量的變量,并需要頻繁查閱有關(guān)輸入和輸出參數(shù)的文檔。平面命名空間中的每個(gè)磁盤文件的一個(gè)功能對(duì)于一個(gè)小項(xiàng)目來(lái)說非常簡(jiǎn)單,但是對(duì)于大型項(xiàng)目來(lái)說卻是一個(gè)令人頭痛的問題。如果你想避免速度瓶頸,則必須應(yīng)用某些編程模式(矢量化,內(nèi)存預(yù)分配)。科學(xué)計(jì)算現(xiàn)在被應(yīng)用于更多的領(lǐng)域,擁有大量不同的本地?cái)?shù)據(jù)類型。等等。

  MathWorks通過繼續(xù)在MATLAB中進(jìn)行創(chuàng)新來(lái)做出回應(yīng):內(nèi)聯(lián)函數(shù),嵌套函數(shù),變量閉包,多數(shù)據(jù)類型,面向?qū)ο蟮奶匦?#xff0c;單元測(cè)試框架等等。每項(xiàng)創(chuàng)新都可能是解決一個(gè)重要問題的方法。但是40年改變的積累卻產(chǎn)生了破壞簡(jiǎn)單性和統(tǒng)一性概念的副作用。在2009年,我寫了一本書,在不到100頁(yè)的篇幅里,很好地涵蓋了我認(rèn)為MATLAB的基本內(nèi)容。據(jù)我所知,所有這些依然可用,但是現(xiàn)在你需要了解更多才能稱自己是精通的。

  Python

  從某種意義上講,Python的歷史來(lái)幾乎是MATLAB的鏡像,兩者都具有交互式命令行(現(xiàn)在被廣泛稱為REPL,即“real-eval-print loop”),并且不受變量聲明和編譯的限制。但是MATLAB是作為數(shù)值分析師的游樂場(chǎng)而創(chuàng)建的,而Python則是考慮黑客的情況下創(chuàng)建的。然后通過修訂和擴(kuò)展,每個(gè)都向其他受眾發(fā)展。

  在我看來(lái),Python仍然缺少數(shù)學(xué)吸引力。你有一些尷尬和小煩惱,例如對(duì)于矩陣乘法用**替換^和@(最近的一項(xiàng)創(chuàng)新),一個(gè)shape而不是矩陣大小,面向行存儲(chǔ)等。如果你認(rèn)為

  V.conj().T@D**3@V是一個(gè)優(yōu)雅的寫作方式來(lái)書寫VD3V,那么你可能需要看醫(yī)生。還有零索引(即與從1開始的索引相反)。我讀過這些論點(diǎn),我認(rèn)為它們不具有決定性。這顯然是一個(gè)偏好的問題——網(wǎng)絡(luò)圣戰(zhàn)的內(nèi)容——因?yàn)槟憧梢耘e出笨拙的例子來(lái)說明任何一種約定。我發(fā)現(xiàn)決定性的是,我們有數(shù)十年的數(shù)學(xué)實(shí)踐索引向量和矩陣,大量偽代碼做出了這個(gè)假設(shè)。

  除了這些小煩惱外,我發(fā)現(xiàn)Python+NumPy+SciPy生態(tài)系統(tǒng)既笨拙且不一致。盡管語(yǔ)言主要用于面向?qū)ο?#xff0c;但存在一個(gè)矩陣類,但它的使用并不鼓勵(lì)且被棄用。也許MATLAB使我墮落,但是我發(fā)現(xiàn)矩陣是一個(gè)非常重要的對(duì)象類型,可以幫助和提升。OOP的主要賣點(diǎn)不就是你可以用*來(lái)對(duì)數(shù)組和矩陣能做不同的事嗎?在這方面還有許多不足之處。(為什么我需要一個(gè)名為spsovle的命令?我不能在稀疏矩陣上調(diào)用solve解決嗎?然后繼續(xù))。

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

  一些專家認(rèn)為,對(duì)于Python代碼在執(zhí)行速度上很難跟上編譯性語(yǔ)言,有著深層次原因。我對(duì)搜索“python太慢了”的結(jié)果感到很開心,Python的擁護(hù)者做了很多以前MATLAB做過相同的爭(zhēng)論和道歉,這并不意味著他們錯(cuò)了,但也不僅僅是感知問題。

  我想我明白為什么Python對(duì)科學(xué)計(jì)算領(lǐng)域的許多人來(lái)說都是如此令人興奮。它有一些MATLAB風(fēng)格式的語(yǔ)法和功能,可以從REPL獲得。它周圍有很好的工具,可以很好地與其他語(yǔ)言以及計(jì)算領(lǐng)域配合使用。它免費(fèi)且具有更好的長(zhǎng)期可復(fù)用性。很明顯,它適用于很多可能沒有什么理由去改變的人。

  但是對(duì)于我知道如何在科學(xué)計(jì)算中做的事情來(lái)說,Python比我習(xí)慣的更像一項(xiàng)學(xué)習(xí)和使用的苦差事。我們暫時(shí)還不知道它是否會(huì)繼續(xù)席卷整個(gè)社區(qū),或者已經(jīng)接近頂峰。我沒有特殊的預(yù)測(cè)能力,但我對(duì)它未來(lái)看跌。

  Julia

  Julia有后來(lái)者其優(yōu)點(diǎn)和缺點(diǎn)。我贊賞Julia的創(chuàng)作者認(rèn)為他們可以做得更好:

  

我們想要一種具有自由許可的開源語(yǔ)言。希望擁有C的速度和Ruby的靈活。我們想要一種同像性語(yǔ)言,有像Lisp這樣真正的宏,而又有MATLAB般淺顯熟悉的數(shù)學(xué)符號(hào);我們想要一門像Python一樣可用于通用編程、像R般在統(tǒng)計(jì)分析上得心應(yīng)手、像Perl般自然地處理字符串、像MATLAB般具有強(qiáng)大的線性代數(shù)運(yùn)算能力、像shell般擅長(zhǎng)將程序粘合在一起的語(yǔ)言。它簡(jiǎn)單易學(xué),卻又讓嚴(yán)苛的黑客為之傾心;還有,我們希望它是交互式的,同時(shí)具備可編譯性。

?

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

  這是我使用的第一種超越ASCII的語(yǔ)言。通過使用像的變量,和≈的操作符,我仍然得不到合理的滿足感。它不僅僅是表面的;能夠看起來(lái)像我們寫的數(shù)學(xué)表達(dá)式是其真正的優(yōu)勢(shì),盡管他確實(shí)會(huì)使教學(xué)和文檔變得有點(diǎn)復(fù)雜。

  使用Julia工作讓我覺得我養(yǎng)成了一些編程習(xí)慣,是因?yàn)镸ATLAB的選擇,而非內(nèi)在的優(yōu)越性。矢量化對(duì)于許多事情并不自然。在Julia中發(fā)現(xiàn),只要在函數(shù)名加一個(gè)點(diǎn),你就可以對(duì)任何函數(shù)矢量化,這一點(diǎn)令人大開眼界。通過訓(xùn)練構(gòu)造矩陣,相比之下,使得嵌套循環(huán)(或meshgrid技巧)看起來(lái)像是馬車鞭子,并且通過生成器完全避免矩陣來(lái)進(jìn)行簡(jiǎn)單的求和,感覺像沒有付出代價(jià)就到手了。(我知道Python有類似的語(yǔ)言特性)。

  多重派發(fā)這一大特性使得某些事情比面向?qū)ο笞龈菀缀颓逦?#xff0c;例如,假設(shè)你有傳統(tǒng)面向?qū)ο笳Z(yǔ)言中的Wall和Ball類,那個(gè)類會(huì)檢測(cè)Ball和Wall之間的沖突?或者你需要一個(gè)Room類來(lái)充當(dāng)裁判?這類問題讓我心煩意亂。使用多重派發(fā),數(shù)據(jù)被打包到對(duì)象類型中,但是對(duì)數(shù)據(jù)進(jìn)行操作的方法不會(huì)綁定到類。因此:

   functiondetect_collision(B::Ball,W::Wall)

  了解類型,但是他們是獨(dú)立定義, 對(duì)我來(lái)說,需要花費(fèi)大量的編程來(lái)理解多重派發(fā)的概念對(duì)于擴(kuò)展語(yǔ)言是多么有趣和潛在的重要性。

  數(shù)字生態(tài)系統(tǒng)一直在迅速發(fā)展。我的第一個(gè)例子是DifferentialEquations.jl,由令人驚嘆的Chris Rackauckas編寫。如果這個(gè)軟件不能馬上贏得Wilkinson獎(jiǎng),那么系統(tǒng)就會(huì)崩潰。只需要去網(wǎng)站準(zhǔn)備轉(zhuǎn)換。

  我還沒有看到Julia承諾的高于MATLAB的速度提升。部分原因是我相對(duì)缺乏經(jīng)驗(yàn)和我所做的任務(wù),但部分原因在于MathWorks在自動(dòng)化代碼方面做了令人難以置信的工作。不管怎樣,這不是我在大部分時(shí)間關(guān)注的編碼方面。

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

  總而言之

  MATLAB是企業(yè)解決方案,尤其適用于工程。對(duì)于基本數(shù)字任務(wù)它可能仍然是最容易學(xué)習(xí)的。細(xì)致的文檔和數(shù)十年貢獻(xiàn)的學(xué)習(xí)工具絕對(duì)重要。

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

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

  Julia是特斯拉,它是以改變未來(lái)這一膽大目標(biāo)而建立,它可能會(huì)。它也可能只是一個(gè)腳注,但與此同時(shí),你將成功地得到你想要的,并有余力。

  你怎么看?

  @Hprotagonist:

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

  它的設(shè)計(jì)并不是為了制造可維護(hù)、易于測(cè)試和易于重構(gòu)的流水線工具,而從未如此,它能處理類似“簡(jiǎn)單明確的字符串和路徑操作”這些基本事情,充其量是一個(gè)奇怪的仿C、Fortan、Java,且當(dāng)其他任何語(yǔ)言當(dāng)增加這些特性都會(huì)風(fēng)靡一時(shí)。

  我對(duì)MATLAB技術(shù)內(nèi)容或多或少有一點(diǎn)煩惱。(我能忍受一個(gè)索引):

   size([1])
ans=[11]

  這完全是錯(cuò)誤的,而numpy是正確的:

   In[0]np.array([1]).shapeOut[0](1,)

  Python實(shí)際上是一種通用語(yǔ)言,具有成熟的科學(xué)堆棧,使用它的數(shù)值計(jì)算我感覺更安全,因?yàn)槲铱梢杂幸粋€(gè)強(qiáng)大的測(cè)試套件和命令行輸入指向我的代碼,這增加了我對(duì)我的代碼正在做我認(rèn)為應(yīng)該做的事的信心,使其易于使用。

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

  必要時(shí)我會(huì)維護(hù)matlab,但是我不太喜歡它。

  @nimrody:

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

  如果函數(shù)不能修改其參數(shù),Matlab將嘗試優(yōu)化并避免復(fù)制。Matlab(有時(shí))也足夠聰明,因此A=f(A)會(huì)在適當(dāng)?shù)奈恢眯薷腁而不是復(fù)制。

  這就是我對(duì)于數(shù)學(xué)導(dǎo)向語(yǔ)言的期望。如果可能的話,保持引用透明的假象,然后在內(nèi)部進(jìn)行優(yōu)化。

  MATLAB也有合理的JIT編譯器,一個(gè)很好的調(diào)試器。

  我不再使用MATLAB,但是它是科學(xué)計(jì)算(模擬,探索)的一個(gè)非常高效的環(huán)境。

  @ggcdn:

  MATLAB有它的獨(dú)特,但我從來(lái)沒有遇到過更好的IDE來(lái)調(diào)試“科學(xué)”代碼或腳本。通過將鼠標(biāo)懸停在變量上來(lái)查看當(dāng)前值,能夠暫停和執(zhí)行某些“測(cè)試”代碼,或者重寫代碼并繼續(xù)執(zhí)行,能夠輕松編輯類似excel表中的數(shù)組或矩陣,當(dāng)寫成代碼時(shí),有看起來(lái)不像狗屎一樣矩陣算法...這些是我認(rèn)為非常有用的東西。我僅僅因?yàn)檫@些原因在我的領(lǐng)域(結(jié)構(gòu)工程)中使用它,即使它可能會(huì)比較慢,或者更難以完成某些任務(wù)。

  @ohsonice:

  我的(數(shù)學(xué)研究生院)觀點(diǎn):

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

  我參加了用Python教授的ML課程。我所有的數(shù)值分析和建模課程都依賴MATLAB于來(lái)做示例和作業(yè)。我(作為一個(gè)數(shù)學(xué)界之外的程序員)選擇Julia進(jìn)行研究。現(xiàn)在我做更多的理論研究,因?yàn)槲也幌矚g混合編碼和運(yùn)算。

  一位同學(xué),在FORTRAN平臺(tái)開發(fā)PDE解算器,導(dǎo)師告訴他先讓其在MATLAB中工作,然后再轉(zhuǎn)向更快的語(yǔ)言。

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

總結(jié)

以上是生活随笔為你收集整理的全面对比 MATLAB、Julia、Python,谁在科学计算中更胜一筹?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。