Matlab和Python(Numpy,Scipy)与Lapack的关系
說到數值計算,可能許多人都能立馬想到Matlab。Matlab多年的持續影響力已經讓它成為許多人心中科學計算的代名詞。但它底層一個重要的庫Lapack卻很少有人知道。
而Python年齡比Matlab小得多,最近幾年隨著AI的流行它也開始火了起來。由于做機器學習本質上了也是在做計算,所以許多人也開始在想Python是不是也能做數值計算。當然,Python本身其實只是一個很“簡單”的語言,它的數值計算模塊實際上是由Numpy和Scipy兩個庫來實現。而其中最重要的模塊之一–線性代數模塊–就是直接調用Lapack來實現的。
本文就這兩個工具與Lapack之間的關系進行簡要介紹,同時也討論一下在這種關系的情況下,究竟有哪些事情和我們平時想得可能不大一樣。
一、LAPACK
LAPACK是由田納西大學、加州伯克利分校,科羅拉多丹佛大學以及法國數值算法(集團)有限公司聯合開發的開源項目。其官方網站在:http://www.netlib.org/lapack/。
這個工具底層是由Fortran實現。有報告顯示,Fortran實現的矩陣計算要比C/C++還要快,因此這個庫的效率也是極高的。
由官網顯示,LAPACK曾多年受到Mathworks和Intel的攢助。
二、Matlab與Lapack
Matlab的官方文檔中其實清楚地說明了它和LAPACK之間的關系:
LAPACK(線性代數包)是一個例程庫,它為數值線性代數和矩陣計算提供快速、穩健的算法。MATLAB? 中的線性代數函數和矩陣運算均基于 LAPACK 構建,并且繼續受益于其例程的性能和精度。1
另外,關于他們的歷史還有一些簡要的介紹:
MATLAB 誕生于 20 世紀 70 年代后期,是一款基于 LINPACK 和 EISPACK 構建的交互式計算器,而 LINPACK 和 EISPACK 在當時是進行矩陣計算的最先進的 Fortran 子例程庫。多年來,MATLAB 使用了 LINPACK 和 EISPACK 的十幾個 Fortran 子例程的 C 語言版本。
2000 年,MATLAB 改用 LAPACK,這是 LINPACK 和 EISPACK 的現代替代品。它是一個用于數值線性代數的大型、多作者 Fortran 庫。LAPACK 最初是為在超級計算機上使用而設計的,因為它能夠一次計算矩陣的多個列。LAPACK 例程的速度與基本線性代數子例程 (BLAS) 的速度密切相關。BLAS 版本通常特定于硬件并經過高度優化。
三、Python(Numpy, Scipy)與Lapack
在Numpy官網中明確就寫著這么幾個大字:
NumPy – A Replacement for MatLab
這個的確有點囂張。
在它的文檔中也能明確看到,它底層的矩陣計算全部來自LAPACK。
四、明白上述關系對我們有何用處
介紹上述內容根本上就是為我們實操提供指導的,那么他們之間的這種關系能為我們帶來哪些啟示?
- 功能上
Matlab作為老牌數值計算工具,其功能豐富無比。Numpy雖然如此囂張地說要替代Matlab但這底氣實在還是不足。上述關系表明它們在底層數值矩陣模塊都是基于同一個基庫,但并不代表在其基礎之上的開發是同一個量級和水平的。
當然,從另一個方面來說,正因為它們的基庫是一樣的,因此在某些具有相同或者相似功能的模塊上它們的功能是可以完全等效的。這一點非常重要!因為這就意味著只要是Numpy具有的功能,基本上就可以認為它和Matlab是基本等效的,因此就可以節省大量的測試時間。
這件事情我們之前也做過一些簡單的工作,比如:深度對比Python(Numpy,Scipy)與Matlab的數值精度。這篇報告里就十分細致地對比了二者在解線性方程組中的精度,最后發現其結果完全一致(精確到最后一位有效的小數位上)。
那么從這個角度上講,Numpy在某些計算問題上替代Matlab也是完全可行的!
- 效率上
許多人都抱怨Matlab很慢,當然更多人也在抱怨Python很慢。但這二者的慢都有一個共同的特點:在運行其自身的模塊時就非常慢!最典型的就是用它們寫循環,比起C完全就不是一個量級。
但注意到前面所說的:Fortran的矩陣計算效率甚至是要快過純C/C++的!那么這就意味著,如果我們能夠盡可能地利用LAPACK模塊進行計算,那么運算效率就一定能上去!
比如機器學習庫sklearn,其底層就是直接依賴Numpy。但我們在實踐中也不難發現sklearn的效率極高。這就是因為它在做復雜的計算的時候主要都是在調用LAPACK的模塊。
那么從技巧上講,最簡單的方法其實就是向量化。因為向量化可以極大減少循環的使用,從而就能夠使盡可能多的計算都由LAPACK來實現,而不是用Matlab或者Python自帶的循環來實現。
另外,筆者也做過一些測試,比如一個簡單的矩陣乘法。如果用Matlab的循環來實現,大概比直接用Matlab的矩陣乘法多1000倍以上的時間。
我曾經也試過修改過一個算法,向量化過后在1W量級的數據集上可以將運算時間從30分鐘降低到30秒左右。
- 關于Python和Matlab的效率
目前關于這2種語言的速度的對比也有不少了,這里就不太多說。總體感覺二者在不同的問題上還是各有不同的表現。但這里需要強調的一些問題是:
? (1)Matlab是一個統一框架的軟件,而Python的各種對比本質上是各種庫的對比,因此單說誰快誰慢其實都是不太嚴謹的。
? (2)Matlab作為一款成熟的商業軟件,其相關的配套功能也是比較健全的。在運行效率上有個很明顯的特點就是:它優化了硬件層面的保護,因此在進行大規模計算時不會盡最大努力去壓榨硬件的能力,因此在一些大量問題的時候可能會顯得慢一些。但這種保護同時也帶來了更高的穩定性。相反,Python的各種庫(包括Numpy和Scipy),本質上都是以功能導向的。并不會對硬件層面進行太多優化,因此它會放任程序對硬件進行最大程度的壓榨。所以在具體使用時也需要注意這個問題。
筆者曾多次使用Python的joblib模塊來進行并行計算。讓我體會最深刻的是一旦運算量較大,CPU的溫度就會飚升,甚至觸發操作系統自帶的硬件保護機制(有時是魯大師的高溫報警)。這一點可能也不是什么好事,因為這樣會明顯折損硬件的壽命。因此在使用時要特別注意。
五、寫在最后
簡單說完了Matlab和Python(Numpy, Scipy)與LAPACK之間的關系并分析了一些用處。從上述分析不難看到,了解這些“周邊”知識對我們的工作和學習實際上也是有不小的幫助的。由于Python和LAPACK的這種關系,使得它其實也可以做一些科學計算的工作。Matlab由于底層調用LAPACK,因此也能提高效率。
本文的介紹和分析還很窄,今后如果有機會還可以更加深入地討論這些問題。
https://ww2.mathworks.cn/help/matlab/math/lapack-in-matlab.html ??
總結
以上是生活随笔為你收集整理的Matlab和Python(Numpy,Scipy)与Lapack的关系的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深度对比Python(Numpy,Sci
- 下一篇: Numpy数组常用函数汇总(数学运算、三