'論操作體驗,MATLAB、Julia & Python哪個更好?'

"
"
論操作體驗,MATLAB、Julia & Python哪個更好?

我一直質疑自己在研究和教學中是否應該繼續使用 MATLAB。然而,雖然使用起來得心應手,也投入了很多,但我很難調動起學習新東西的動力。

我和其他人合作寫過一本介紹計算科學的 MATLAB 教材。這本書裡有 40 多個函數和 160 多個計算樣例,它涵蓋了我認為在數值科學計算中 MATLAB 的所有基礎使用方法。為了實現自我提升,並增強該書的實用性,今年我開始把這些代碼用 Julia 和 Python 實現。這種實踐讓我對三種語言在科學計算中的應用有了更特別的體會,下面我將進行詳細說明。

先不考慮成本和開放性問題。與 Python 和 Julia 不同,MATLAB 既不是免費軟件,也不是開源軟件。對很多人來說,這是一個極大的區別,甚至是致命性的,但我認為這是一個技術優勢。多年來,MATLAB 在很多方面發揮了遠超過其它任何免費產品的實用價值,使用免費產品並希望達到一定成效,成本反而會很高。這一點對語言和生態系統的理想化訴求,需要單獨進行考慮。

如果不考慮成本,可以看到這些語言起源時的諸多不同之處。MATLAB 最早出現時,側重於數學方面,尤其是在數值運算相關的數學領域。Python 在上世紀八十年代後期出現,關注計算科學。Julia 開始於 2009 年,力求在多個方面實現平衡。

MATLAB

"
論操作體驗,MATLAB、Julia & Python哪個更好?

我一直質疑自己在研究和教學中是否應該繼續使用 MATLAB。然而,雖然使用起來得心應手,也投入了很多,但我很難調動起學習新東西的動力。

我和其他人合作寫過一本介紹計算科學的 MATLAB 教材。這本書裡有 40 多個函數和 160 多個計算樣例,它涵蓋了我認為在數值科學計算中 MATLAB 的所有基礎使用方法。為了實現自我提升,並增強該書的實用性,今年我開始把這些代碼用 Julia 和 Python 實現。這種實踐讓我對三種語言在科學計算中的應用有了更特別的體會,下面我將進行詳細說明。

先不考慮成本和開放性問題。與 Python 和 Julia 不同,MATLAB 既不是免費軟件,也不是開源軟件。對很多人來說,這是一個極大的區別,甚至是致命性的,但我認為這是一個技術優勢。多年來,MATLAB 在很多方面發揮了遠超過其它任何免費產品的實用價值,使用免費產品並希望達到一定成效,成本反而會很高。這一點對語言和生態系統的理想化訴求,需要單獨進行考慮。

如果不考慮成本,可以看到這些語言起源時的諸多不同之處。MATLAB 最早出現時,側重於數學方面,尤其是在數值運算相關的數學領域。Python 在上世紀八十年代後期出現,關注計算科學。Julia 開始於 2009 年,力求在多個方面實現平衡。

MATLAB

論操作體驗,MATLAB、Julia & Python哪個更好?

最開始,MATLAB 裡的每個值都是雙精度浮點數組,設計之初就確定了使用數組和浮點數。

浮點數的 IEEE 754 標準直到 1985 年才被採用,那時的內存是用 K 而不是用 G 來測量的。浮點數的雙精度表示並不是最有效的表示字符或整數的方法,但是它們是科學家、工程師以及越來越多的數學家大部分時間裡更願意使用的格式。此外,不需要聲明變量,也不需要顯式地分配內存。讓計算機來處理這些任務,並快速處理數據類型,解放你的大腦去思考對數據進行操作的算法。

數組之所以重要,是因為線性代數中的數值算法正在以 LINPACK 和 EISPACK 的形式出現。但是,使用科學計算的標準載體 FORTRAN 77 來訪問它們是一個多步驟的過程,包括聲明變量、調用名稱神祕的例程、編譯代碼,然後檢查數據和輸出文件。把矩陣乘法寫成 A*B 的形式,然後馬上把答案打印出來,這是一種對遊戲規則的改變。

MATLAB 還使圖形變得更簡單、更容易訪問。沒有使用底層調用和硬件相關的庫,只用一個 plot(x,y) 就可以得到想要的圖形。它還有很多創新之處,比如嵌入複數、稀疏矩陣、構建跨平臺圖形用戶界面的工具,以及領先的 ODE 求解程序套件,這些都使 MATLAB 在科學計算上速度非常快。

然而,對於交互式計算 (即使是長時間的計算) 來說,理想的設計並不總是有助於編寫高性能軟件。在許多函數之間移動數據需要同時處理許多變量,並經常查閱關於輸入和輸出參數的文檔。對於小型項目來說,在平面名稱空間中為每個磁盤文件提供一個函數非常簡單,但是對於大型項目來說就比較麻煩了。如果要避免速度瓶頸,必須應用某些編程模式 (向量化、內存預分配)。科學計算現在被應用到更多領域,擁有大量不同類型的原生數據。

MathWorks 對 MATLAB 持續進行了創新:內聯函數、嵌套函數、變量閉包、大量的數據類型、面向對象特性、單元測試框架等等。每一個創新都可能是一個重要問題的解決方案。但 40 年來這些變化的累積產生了副作用,削弱了概念的簡單性和統一性。2009 年,我寫了一本書,在不到 100 頁的篇幅裡,很好地涵蓋了我認為 MATLAB 的基本內容。據我所知,它們現在仍可用。不過要想精通的話,還需要了解更多。

Python

"
論操作體驗,MATLAB、Julia & Python哪個更好?

我一直質疑自己在研究和教學中是否應該繼續使用 MATLAB。然而,雖然使用起來得心應手,也投入了很多,但我很難調動起學習新東西的動力。

我和其他人合作寫過一本介紹計算科學的 MATLAB 教材。這本書裡有 40 多個函數和 160 多個計算樣例,它涵蓋了我認為在數值科學計算中 MATLAB 的所有基礎使用方法。為了實現自我提升,並增強該書的實用性,今年我開始把這些代碼用 Julia 和 Python 實現。這種實踐讓我對三種語言在科學計算中的應用有了更特別的體會,下面我將進行詳細說明。

先不考慮成本和開放性問題。與 Python 和 Julia 不同,MATLAB 既不是免費軟件,也不是開源軟件。對很多人來說,這是一個極大的區別,甚至是致命性的,但我認為這是一個技術優勢。多年來,MATLAB 在很多方面發揮了遠超過其它任何免費產品的實用價值,使用免費產品並希望達到一定成效,成本反而會很高。這一點對語言和生態系統的理想化訴求,需要單獨進行考慮。

如果不考慮成本,可以看到這些語言起源時的諸多不同之處。MATLAB 最早出現時,側重於數學方面,尤其是在數值運算相關的數學領域。Python 在上世紀八十年代後期出現,關注計算科學。Julia 開始於 2009 年,力求在多個方面實現平衡。

MATLAB

論操作體驗,MATLAB、Julia & Python哪個更好?

最開始,MATLAB 裡的每個值都是雙精度浮點數組,設計之初就確定了使用數組和浮點數。

浮點數的 IEEE 754 標準直到 1985 年才被採用,那時的內存是用 K 而不是用 G 來測量的。浮點數的雙精度表示並不是最有效的表示字符或整數的方法,但是它們是科學家、工程師以及越來越多的數學家大部分時間裡更願意使用的格式。此外,不需要聲明變量,也不需要顯式地分配內存。讓計算機來處理這些任務,並快速處理數據類型,解放你的大腦去思考對數據進行操作的算法。

數組之所以重要,是因為線性代數中的數值算法正在以 LINPACK 和 EISPACK 的形式出現。但是,使用科學計算的標準載體 FORTRAN 77 來訪問它們是一個多步驟的過程,包括聲明變量、調用名稱神祕的例程、編譯代碼,然後檢查數據和輸出文件。把矩陣乘法寫成 A*B 的形式,然後馬上把答案打印出來,這是一種對遊戲規則的改變。

MATLAB 還使圖形變得更簡單、更容易訪問。沒有使用底層調用和硬件相關的庫,只用一個 plot(x,y) 就可以得到想要的圖形。它還有很多創新之處,比如嵌入複數、稀疏矩陣、構建跨平臺圖形用戶界面的工具,以及領先的 ODE 求解程序套件,這些都使 MATLAB 在科學計算上速度非常快。

然而,對於交互式計算 (即使是長時間的計算) 來說,理想的設計並不總是有助於編寫高性能軟件。在許多函數之間移動數據需要同時處理許多變量,並經常查閱關於輸入和輸出參數的文檔。對於小型項目來說,在平面名稱空間中為每個磁盤文件提供一個函數非常簡單,但是對於大型項目來說就比較麻煩了。如果要避免速度瓶頸,必須應用某些編程模式 (向量化、內存預分配)。科學計算現在被應用到更多領域,擁有大量不同類型的原生數據。

MathWorks 對 MATLAB 持續進行了創新:內聯函數、嵌套函數、變量閉包、大量的數據類型、面向對象特性、單元測試框架等等。每一個創新都可能是一個重要問題的解決方案。但 40 年來這些變化的累積產生了副作用,削弱了概念的簡單性和統一性。2009 年,我寫了一本書,在不到 100 頁的篇幅裡,很好地涵蓋了我認為 MATLAB 的基本內容。據我所知,它們現在仍可用。不過要想精通的話,還需要了解更多。

Python

論操作體驗,MATLAB、Julia & Python哪個更好?

從某種意義上說,Python 的歷史似乎是 MATLAB 的一個鏡像。兩者都具有交互式命令行(現在通常叫做 REPL,即“read-eval-print loop”,交互式解釋器)、可以自由定義變量和編譯。不過 MATLAB 是為數值分析而開發的,而 Python 的誕生是為了滿足人們內心的黑客夢。經過改進和擴展,它們越來越趨於同化。

在我看來,Python 仍缺少數學上的吸引力。它有一些討厭的小問題,如使用 而不是 ^,用 @來表示矩陣的相乘(最近的改進!)、使用 shape 而不是 size of 來獲取矩陣的大小、仍使用行數據存儲等等。如果認為用 V.conj().T@D3@V 可以很好地表達 V∗D3VV∗D3V,那真的很好笑。Python 裡索引從 0 開始(與從 1 開始的索引相反)。我閱讀過讀取參數這篇文章,我認為這不是關鍵因素。很明顯,這只是一個習慣問題——就像網上聖戰一樣的問題——因為你也可以給每種命名方式列舉出不好的例子。我覺得最主要的是,我們在數學實踐中從 1 開始標識向量和矩陣已經有數十年了,大部分的偽代碼都做了這樣的假設。

除了這些令人討厭的地方之外,我發現 Python+NumPy+SciPy 的生態系統看起來凌亂且不一致。儘管編程語言致力於面向對象,仍存在矩陣類,但它的使用是不被鼓勵而且正在逐漸消失的。也許 MATLAB 輕易俘獲了我的心,但是我覺得矩陣是很重要的對象類型,應該給予保留和改進。用 * 可以實現對數組和矩陣不同的計算,這難道不是面向對象編程(OOP)的一大賣點嗎?從這一點來看,有很多不合理的地方(為什麼我要使用 spsolve 命令?稀疏據矩陣中,可以只調用 solve 嗎……)。

這個生態系統有些地方看起來有點薄弱。比如,求積分和解常微分方程在 2019 年看來是一個最小的集合。據我所知,沒有針對微分代數方程(DAE)、延時微分方程(DDE)、辛求解的方法或是允許內部 Krylov 子空間迭代的隱式算法。來看下這些函數的相關參考資料,它們都已經 30 年或更久了——仍然很好但遠不夠完整。Matplotlib 包是個了不起的成果,暫時看起來比 MATLAB 更好,但是它缺乏 3D 支持。

一些專家認為,Python 代碼難以跟上編譯語言的執行速度有深層次的原因。當看到“python 很慢”的搜索結果時,我覺得很可笑。Python 的擁護者提出了很多與 MATLAB 相同的論點 / 道歉,並不是說他們錯了,但這不僅僅是一個有沒有遠見的問題。

我想我知道為什麼對於很多從事科學計算的人來說,Python 如此讓人激動。它具有 MATLAB 風格的語法和功能,允許 REPL 運行環境;它有強大的工具,和其它語言在計算領域可以很好地配合使用;它是免費的,從長遠來看,有更好的可重複性。很明顯,它對很多人有效,沒有必要進行語言的切換。

但對於我所知道的科學計算領域,Python 比我過去接觸過的語言在學習和使用上更繁瑣。我們還不知道它是會繼續席捲整個社區,還是已經接近頂峰。我沒有特別的預測能力,但我更傾向於認為它會呈下跌趨勢。

Julia

"
論操作體驗,MATLAB、Julia & Python哪個更好?

我一直質疑自己在研究和教學中是否應該繼續使用 MATLAB。然而,雖然使用起來得心應手,也投入了很多,但我很難調動起學習新東西的動力。

我和其他人合作寫過一本介紹計算科學的 MATLAB 教材。這本書裡有 40 多個函數和 160 多個計算樣例,它涵蓋了我認為在數值科學計算中 MATLAB 的所有基礎使用方法。為了實現自我提升,並增強該書的實用性,今年我開始把這些代碼用 Julia 和 Python 實現。這種實踐讓我對三種語言在科學計算中的應用有了更特別的體會,下面我將進行詳細說明。

先不考慮成本和開放性問題。與 Python 和 Julia 不同,MATLAB 既不是免費軟件,也不是開源軟件。對很多人來說,這是一個極大的區別,甚至是致命性的,但我認為這是一個技術優勢。多年來,MATLAB 在很多方面發揮了遠超過其它任何免費產品的實用價值,使用免費產品並希望達到一定成效,成本反而會很高。這一點對語言和生態系統的理想化訴求,需要單獨進行考慮。

如果不考慮成本,可以看到這些語言起源時的諸多不同之處。MATLAB 最早出現時,側重於數學方面,尤其是在數值運算相關的數學領域。Python 在上世紀八十年代後期出現,關注計算科學。Julia 開始於 2009 年,力求在多個方面實現平衡。

MATLAB

論操作體驗,MATLAB、Julia & Python哪個更好?

最開始,MATLAB 裡的每個值都是雙精度浮點數組,設計之初就確定了使用數組和浮點數。

浮點數的 IEEE 754 標準直到 1985 年才被採用,那時的內存是用 K 而不是用 G 來測量的。浮點數的雙精度表示並不是最有效的表示字符或整數的方法,但是它們是科學家、工程師以及越來越多的數學家大部分時間裡更願意使用的格式。此外,不需要聲明變量,也不需要顯式地分配內存。讓計算機來處理這些任務,並快速處理數據類型,解放你的大腦去思考對數據進行操作的算法。

數組之所以重要,是因為線性代數中的數值算法正在以 LINPACK 和 EISPACK 的形式出現。但是,使用科學計算的標準載體 FORTRAN 77 來訪問它們是一個多步驟的過程,包括聲明變量、調用名稱神祕的例程、編譯代碼,然後檢查數據和輸出文件。把矩陣乘法寫成 A*B 的形式,然後馬上把答案打印出來,這是一種對遊戲規則的改變。

MATLAB 還使圖形變得更簡單、更容易訪問。沒有使用底層調用和硬件相關的庫,只用一個 plot(x,y) 就可以得到想要的圖形。它還有很多創新之處,比如嵌入複數、稀疏矩陣、構建跨平臺圖形用戶界面的工具,以及領先的 ODE 求解程序套件,這些都使 MATLAB 在科學計算上速度非常快。

然而,對於交互式計算 (即使是長時間的計算) 來說,理想的設計並不總是有助於編寫高性能軟件。在許多函數之間移動數據需要同時處理許多變量,並經常查閱關於輸入和輸出參數的文檔。對於小型項目來說,在平面名稱空間中為每個磁盤文件提供一個函數非常簡單,但是對於大型項目來說就比較麻煩了。如果要避免速度瓶頸,必須應用某些編程模式 (向量化、內存預分配)。科學計算現在被應用到更多領域,擁有大量不同類型的原生數據。

MathWorks 對 MATLAB 持續進行了創新:內聯函數、嵌套函數、變量閉包、大量的數據類型、面向對象特性、單元測試框架等等。每一個創新都可能是一個重要問題的解決方案。但 40 年來這些變化的累積產生了副作用,削弱了概念的簡單性和統一性。2009 年,我寫了一本書,在不到 100 頁的篇幅裡,很好地涵蓋了我認為 MATLAB 的基本內容。據我所知,它們現在仍可用。不過要想精通的話,還需要了解更多。

Python

論操作體驗,MATLAB、Julia & Python哪個更好?

從某種意義上說,Python 的歷史似乎是 MATLAB 的一個鏡像。兩者都具有交互式命令行(現在通常叫做 REPL,即“read-eval-print loop”,交互式解釋器)、可以自由定義變量和編譯。不過 MATLAB 是為數值分析而開發的,而 Python 的誕生是為了滿足人們內心的黑客夢。經過改進和擴展,它們越來越趨於同化。

在我看來,Python 仍缺少數學上的吸引力。它有一些討厭的小問題,如使用 而不是 ^,用 @來表示矩陣的相乘(最近的改進!)、使用 shape 而不是 size of 來獲取矩陣的大小、仍使用行數據存儲等等。如果認為用 V.conj().T@D3@V 可以很好地表達 V∗D3VV∗D3V,那真的很好笑。Python 裡索引從 0 開始(與從 1 開始的索引相反)。我閱讀過讀取參數這篇文章,我認為這不是關鍵因素。很明顯,這只是一個習慣問題——就像網上聖戰一樣的問題——因為你也可以給每種命名方式列舉出不好的例子。我覺得最主要的是,我們在數學實踐中從 1 開始標識向量和矩陣已經有數十年了,大部分的偽代碼都做了這樣的假設。

除了這些令人討厭的地方之外,我發現 Python+NumPy+SciPy 的生態系統看起來凌亂且不一致。儘管編程語言致力於面向對象,仍存在矩陣類,但它的使用是不被鼓勵而且正在逐漸消失的。也許 MATLAB 輕易俘獲了我的心,但是我覺得矩陣是很重要的對象類型,應該給予保留和改進。用 * 可以實現對數組和矩陣不同的計算,這難道不是面向對象編程(OOP)的一大賣點嗎?從這一點來看,有很多不合理的地方(為什麼我要使用 spsolve 命令?稀疏據矩陣中,可以只調用 solve 嗎……)。

這個生態系統有些地方看起來有點薄弱。比如,求積分和解常微分方程在 2019 年看來是一個最小的集合。據我所知,沒有針對微分代數方程(DAE)、延時微分方程(DDE)、辛求解的方法或是允許內部 Krylov 子空間迭代的隱式算法。來看下這些函數的相關參考資料,它們都已經 30 年或更久了——仍然很好但遠不夠完整。Matplotlib 包是個了不起的成果,暫時看起來比 MATLAB 更好,但是它缺乏 3D 支持。

一些專家認為,Python 代碼難以跟上編譯語言的執行速度有深層次的原因。當看到“python 很慢”的搜索結果時,我覺得很可笑。Python 的擁護者提出了很多與 MATLAB 相同的論點 / 道歉,並不是說他們錯了,但這不僅僅是一個有沒有遠見的問題。

我想我知道為什麼對於很多從事科學計算的人來說,Python 如此讓人激動。它具有 MATLAB 風格的語法和功能,允許 REPL 運行環境;它有強大的工具,和其它語言在計算領域可以很好地配合使用;它是免費的,從長遠來看,有更好的可重複性。很明顯,它對很多人有效,沒有必要進行語言的切換。

但對於我所知道的科學計算領域,Python 比我過去接觸過的語言在學習和使用上更繁瑣。我們還不知道它是會繼續席捲整個社區,還是已經接近頂峰。我沒有特別的預測能力,但我更傾向於認為它會呈下跌趨勢。

Julia

論操作體驗,MATLAB、Julia & Python哪個更好?

作為後來者,Julia 有優勢也有劣勢。我為 Julia 的創建者鼓掌,因為我相信他們能做得更好:我們需要一門開源的語言,沒有使用許可限制。我們希望它有 C 的速度,Ruby 的活力。我們需要像 homoiconic 一樣的語言,它像 Lisp 一樣有宏,但是也像 Matlab 一樣有顯而易見、熟悉的數學標記。我們希望它像 Python 一樣普通適用,像 R 語言一樣適用於統計,像 Perl 一樣適用於字符串處理,像 Matlab 處理線性代數一樣強大,像 DOS 命令一樣擅長粘合程序。它簡單易學,卻讓黑客因其挑戰性而歡欣。我們希望它具有互動性且能夠被編譯。

在很大程度上,我相信他們已經做到了。在後續的 1.0 版本上,REPL 的重要性有所下降,有一些和 MATLAB 略有差別的改動(LinRange 確實比 linspace 更好嗎?)。不過這些都是小事而已。

這是我使用的第一種超越 ASCII 的語言,我對其感到不可思議的滿意。比如在使用 ϕ變量和≈操作符時,它不僅僅在表面表現優異,雖然需要複雜的教學和文檔,但它可以讓代碼更接近我們所寫的數學表達式,而這才是真正的優勢。

使用 Julia,我才認識到我保留了很多 MATLAB 的編程習慣,而不是因為其先天優勢。很多時候,矢量化並不容易。但在 Julia 中,可以給任意函數名上添加一個點將其矢量化,這讓人大開眼界。Julia 用 comprehension 來創建一個矩陣,讓 MATLAB 中的嵌套循環(或 meshgrid )看起來有點過時,這樣就避免通過 generator 來做簡單的彙總,免得大材小用(我記得 Python 也有這個功能)。

相較於面向對象,多重分派(multiple dispatch)讓很多事情變得更簡單清晰。例如,假設在傳統的面嚮對象語言中,有 Wall 和 Ball 兩個類,哪個類可以檢測到 Ball 碰到了 Wall 呢?是否需要一個 Room 類來做裁判呢?這類問題讓我很困擾。而通過多重分派,數據和對象類型綁定在一起,但是操作數據的方法不需要和類綁定。因此,知道類的類型,但它是獨立定義的。我編程很久才意識到,多重分派的有趣和理解多重分派在語言擴展上的重要性。

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

數字生態系統演進速度非常快。第一個例子是 DifferentialEquations.jl,由 Chris Rackauckas 編寫。如果不盡快給這個軟件頒發威爾金森獎,那真是太不應該了。

我還想看到 Julia 所承諾的基於 MATLAB 所做的速度提升。部分是因為我相對經驗不足和我所承擔任務需求,也因為 MathWorks 在自動化代碼優化方面做了很出色的工作。在大部分時間裡,我所關注的不是編程方面的問題。

用 Julia 編程讓我花了一段時間才適應 (或許因為我開始變老了,思想固化了)。它讓我對數據類型的思考超出了我的想象,我還總覺得自己沒有按正確方式去做事。但對於日常使用,我現在更傾向於使用 Julia,而不是 MATLAB。

總結

MATLAB 是一個企業級解決方案,尤其對於工程而言。對於基本數值任務來說,它是最容易學習的。詳盡的文檔和多年積累的學習工具也相當重要。

MATLAB 是科學計算領域中的寶馬轎車。它很昂貴,還不包括附件(工具箱)。你需要為其堅固的車體、平穩的性能和服務而買單。但它也會帶來與其價值不匹配的困擾。

Python 是福特皮卡。他在很多地方(美國)廣受歡迎。它可以做你希望的任何事,也可以做到其他汽車所不能做到的。你可能時而想要借用一下,但它提供不了純粹的駕駛體驗。

Julia 是特斯拉。它的創造有一個大膽的目標,那就是改變未來。它也可能只是一個腳註,但與此同時,你會很舒服地到達你要去的地方,並且電量會有盈餘。

如果大家有什麼JAVA學習問題的可以隨時找我交流,或者私信我獲取JAVA系統學習資料!

本文轉載至——AI前線。


"
論操作體驗,MATLAB、Julia & Python哪個更好?

我一直質疑自己在研究和教學中是否應該繼續使用 MATLAB。然而,雖然使用起來得心應手,也投入了很多,但我很難調動起學習新東西的動力。

我和其他人合作寫過一本介紹計算科學的 MATLAB 教材。這本書裡有 40 多個函數和 160 多個計算樣例,它涵蓋了我認為在數值科學計算中 MATLAB 的所有基礎使用方法。為了實現自我提升,並增強該書的實用性,今年我開始把這些代碼用 Julia 和 Python 實現。這種實踐讓我對三種語言在科學計算中的應用有了更特別的體會,下面我將進行詳細說明。

先不考慮成本和開放性問題。與 Python 和 Julia 不同,MATLAB 既不是免費軟件,也不是開源軟件。對很多人來說,這是一個極大的區別,甚至是致命性的,但我認為這是一個技術優勢。多年來,MATLAB 在很多方面發揮了遠超過其它任何免費產品的實用價值,使用免費產品並希望達到一定成效,成本反而會很高。這一點對語言和生態系統的理想化訴求,需要單獨進行考慮。

如果不考慮成本,可以看到這些語言起源時的諸多不同之處。MATLAB 最早出現時,側重於數學方面,尤其是在數值運算相關的數學領域。Python 在上世紀八十年代後期出現,關注計算科學。Julia 開始於 2009 年,力求在多個方面實現平衡。

MATLAB

論操作體驗,MATLAB、Julia & Python哪個更好?

最開始,MATLAB 裡的每個值都是雙精度浮點數組,設計之初就確定了使用數組和浮點數。

浮點數的 IEEE 754 標準直到 1985 年才被採用,那時的內存是用 K 而不是用 G 來測量的。浮點數的雙精度表示並不是最有效的表示字符或整數的方法,但是它們是科學家、工程師以及越來越多的數學家大部分時間裡更願意使用的格式。此外,不需要聲明變量,也不需要顯式地分配內存。讓計算機來處理這些任務,並快速處理數據類型,解放你的大腦去思考對數據進行操作的算法。

數組之所以重要,是因為線性代數中的數值算法正在以 LINPACK 和 EISPACK 的形式出現。但是,使用科學計算的標準載體 FORTRAN 77 來訪問它們是一個多步驟的過程,包括聲明變量、調用名稱神祕的例程、編譯代碼,然後檢查數據和輸出文件。把矩陣乘法寫成 A*B 的形式,然後馬上把答案打印出來,這是一種對遊戲規則的改變。

MATLAB 還使圖形變得更簡單、更容易訪問。沒有使用底層調用和硬件相關的庫,只用一個 plot(x,y) 就可以得到想要的圖形。它還有很多創新之處,比如嵌入複數、稀疏矩陣、構建跨平臺圖形用戶界面的工具,以及領先的 ODE 求解程序套件,這些都使 MATLAB 在科學計算上速度非常快。

然而,對於交互式計算 (即使是長時間的計算) 來說,理想的設計並不總是有助於編寫高性能軟件。在許多函數之間移動數據需要同時處理許多變量,並經常查閱關於輸入和輸出參數的文檔。對於小型項目來說,在平面名稱空間中為每個磁盤文件提供一個函數非常簡單,但是對於大型項目來說就比較麻煩了。如果要避免速度瓶頸,必須應用某些編程模式 (向量化、內存預分配)。科學計算現在被應用到更多領域,擁有大量不同類型的原生數據。

MathWorks 對 MATLAB 持續進行了創新:內聯函數、嵌套函數、變量閉包、大量的數據類型、面向對象特性、單元測試框架等等。每一個創新都可能是一個重要問題的解決方案。但 40 年來這些變化的累積產生了副作用,削弱了概念的簡單性和統一性。2009 年,我寫了一本書,在不到 100 頁的篇幅裡,很好地涵蓋了我認為 MATLAB 的基本內容。據我所知,它們現在仍可用。不過要想精通的話,還需要了解更多。

Python

論操作體驗,MATLAB、Julia & Python哪個更好?

從某種意義上說,Python 的歷史似乎是 MATLAB 的一個鏡像。兩者都具有交互式命令行(現在通常叫做 REPL,即“read-eval-print loop”,交互式解釋器)、可以自由定義變量和編譯。不過 MATLAB 是為數值分析而開發的,而 Python 的誕生是為了滿足人們內心的黑客夢。經過改進和擴展,它們越來越趨於同化。

在我看來,Python 仍缺少數學上的吸引力。它有一些討厭的小問題,如使用 而不是 ^,用 @來表示矩陣的相乘(最近的改進!)、使用 shape 而不是 size of 來獲取矩陣的大小、仍使用行數據存儲等等。如果認為用 V.conj().T@D3@V 可以很好地表達 V∗D3VV∗D3V,那真的很好笑。Python 裡索引從 0 開始(與從 1 開始的索引相反)。我閱讀過讀取參數這篇文章,我認為這不是關鍵因素。很明顯,這只是一個習慣問題——就像網上聖戰一樣的問題——因為你也可以給每種命名方式列舉出不好的例子。我覺得最主要的是,我們在數學實踐中從 1 開始標識向量和矩陣已經有數十年了,大部分的偽代碼都做了這樣的假設。

除了這些令人討厭的地方之外,我發現 Python+NumPy+SciPy 的生態系統看起來凌亂且不一致。儘管編程語言致力於面向對象,仍存在矩陣類,但它的使用是不被鼓勵而且正在逐漸消失的。也許 MATLAB 輕易俘獲了我的心,但是我覺得矩陣是很重要的對象類型,應該給予保留和改進。用 * 可以實現對數組和矩陣不同的計算,這難道不是面向對象編程(OOP)的一大賣點嗎?從這一點來看,有很多不合理的地方(為什麼我要使用 spsolve 命令?稀疏據矩陣中,可以只調用 solve 嗎……)。

這個生態系統有些地方看起來有點薄弱。比如,求積分和解常微分方程在 2019 年看來是一個最小的集合。據我所知,沒有針對微分代數方程(DAE)、延時微分方程(DDE)、辛求解的方法或是允許內部 Krylov 子空間迭代的隱式算法。來看下這些函數的相關參考資料,它們都已經 30 年或更久了——仍然很好但遠不夠完整。Matplotlib 包是個了不起的成果,暫時看起來比 MATLAB 更好,但是它缺乏 3D 支持。

一些專家認為,Python 代碼難以跟上編譯語言的執行速度有深層次的原因。當看到“python 很慢”的搜索結果時,我覺得很可笑。Python 的擁護者提出了很多與 MATLAB 相同的論點 / 道歉,並不是說他們錯了,但這不僅僅是一個有沒有遠見的問題。

我想我知道為什麼對於很多從事科學計算的人來說,Python 如此讓人激動。它具有 MATLAB 風格的語法和功能,允許 REPL 運行環境;它有強大的工具,和其它語言在計算領域可以很好地配合使用;它是免費的,從長遠來看,有更好的可重複性。很明顯,它對很多人有效,沒有必要進行語言的切換。

但對於我所知道的科學計算領域,Python 比我過去接觸過的語言在學習和使用上更繁瑣。我們還不知道它是會繼續席捲整個社區,還是已經接近頂峰。我沒有特別的預測能力,但我更傾向於認為它會呈下跌趨勢。

Julia

論操作體驗,MATLAB、Julia & Python哪個更好?

作為後來者,Julia 有優勢也有劣勢。我為 Julia 的創建者鼓掌,因為我相信他們能做得更好:我們需要一門開源的語言,沒有使用許可限制。我們希望它有 C 的速度,Ruby 的活力。我們需要像 homoiconic 一樣的語言,它像 Lisp 一樣有宏,但是也像 Matlab 一樣有顯而易見、熟悉的數學標記。我們希望它像 Python 一樣普通適用,像 R 語言一樣適用於統計,像 Perl 一樣適用於字符串處理,像 Matlab 處理線性代數一樣強大,像 DOS 命令一樣擅長粘合程序。它簡單易學,卻讓黑客因其挑戰性而歡欣。我們希望它具有互動性且能夠被編譯。

在很大程度上,我相信他們已經做到了。在後續的 1.0 版本上,REPL 的重要性有所下降,有一些和 MATLAB 略有差別的改動(LinRange 確實比 linspace 更好嗎?)。不過這些都是小事而已。

這是我使用的第一種超越 ASCII 的語言,我對其感到不可思議的滿意。比如在使用 ϕ變量和≈操作符時,它不僅僅在表面表現優異,雖然需要複雜的教學和文檔,但它可以讓代碼更接近我們所寫的數學表達式,而這才是真正的優勢。

使用 Julia,我才認識到我保留了很多 MATLAB 的編程習慣,而不是因為其先天優勢。很多時候,矢量化並不容易。但在 Julia 中,可以給任意函數名上添加一個點將其矢量化,這讓人大開眼界。Julia 用 comprehension 來創建一個矩陣,讓 MATLAB 中的嵌套循環(或 meshgrid )看起來有點過時,這樣就避免通過 generator 來做簡單的彙總,免得大材小用(我記得 Python 也有這個功能)。

相較於面向對象,多重分派(multiple dispatch)讓很多事情變得更簡單清晰。例如,假設在傳統的面嚮對象語言中,有 Wall 和 Ball 兩個類,哪個類可以檢測到 Ball 碰到了 Wall 呢?是否需要一個 Room 類來做裁判呢?這類問題讓我很困擾。而通過多重分派,數據和對象類型綁定在一起,但是操作數據的方法不需要和類綁定。因此,知道類的類型,但它是獨立定義的。我編程很久才意識到,多重分派的有趣和理解多重分派在語言擴展上的重要性。

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

數字生態系統演進速度非常快。第一個例子是 DifferentialEquations.jl,由 Chris Rackauckas 編寫。如果不盡快給這個軟件頒發威爾金森獎,那真是太不應該了。

我還想看到 Julia 所承諾的基於 MATLAB 所做的速度提升。部分是因為我相對經驗不足和我所承擔任務需求,也因為 MathWorks 在自動化代碼優化方面做了很出色的工作。在大部分時間裡,我所關注的不是編程方面的問題。

用 Julia 編程讓我花了一段時間才適應 (或許因為我開始變老了,思想固化了)。它讓我對數據類型的思考超出了我的想象,我還總覺得自己沒有按正確方式去做事。但對於日常使用,我現在更傾向於使用 Julia,而不是 MATLAB。

總結

MATLAB 是一個企業級解決方案,尤其對於工程而言。對於基本數值任務來說,它是最容易學習的。詳盡的文檔和多年積累的學習工具也相當重要。

MATLAB 是科學計算領域中的寶馬轎車。它很昂貴,還不包括附件(工具箱)。你需要為其堅固的車體、平穩的性能和服務而買單。但它也會帶來與其價值不匹配的困擾。

Python 是福特皮卡。他在很多地方(美國)廣受歡迎。它可以做你希望的任何事,也可以做到其他汽車所不能做到的。你可能時而想要借用一下,但它提供不了純粹的駕駛體驗。

Julia 是特斯拉。它的創造有一個大膽的目標,那就是改變未來。它也可能只是一個腳註,但與此同時,你會很舒服地到達你要去的地方,並且電量會有盈餘。

如果大家有什麼JAVA學習問題的可以隨時找我交流,或者私信我獲取JAVA系統學習資料!

本文轉載至——AI前線。


論操作體驗,MATLAB、Julia & Python哪個更好?

"

相關推薦

推薦中...