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

歡迎訪問 生活随笔!

生活随笔

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

python

Matlab和Python(Numpy,Scipy)与Lapack的关系

發(fā)布時(shí)間:2025/4/16 python 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Matlab和Python(Numpy,Scipy)与Lapack的关系 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

說到數(shù)值計(jì)算,可能許多人都能立馬想到Matlab。Matlab多年的持續(xù)影響力已經(jīng)讓它成為許多人心中科學(xué)計(jì)算的代名詞。但它底層一個(gè)重要的庫Lapack卻很少有人知道。

而Python年齡比Matlab小得多,最近幾年隨著AI的流行它也開始火了起來。由于做機(jī)器學(xué)習(xí)本質(zhì)上了也是在做計(jì)算,所以許多人也開始在想Python是不是也能做數(shù)值計(jì)算。當(dāng)然,Python本身其實(shí)只是一個(gè)很“簡單”的語言,它的數(shù)值計(jì)算模塊實(shí)際上是由Numpy和Scipy兩個(gè)庫來實(shí)現(xiàn)。而其中最重要的模塊之一–線性代數(shù)模塊–就是直接調(diào)用Lapack來實(shí)現(xiàn)的。

本文就這兩個(gè)工具與Lapack之間的關(guān)系進(jìn)行簡要介紹,同時(shí)也討論一下在這種關(guān)系的情況下,究竟有哪些事情和我們平時(shí)想得可能不大一樣。

一、LAPACK

LAPACK是由田納西大學(xué)、加州伯克利分校,科羅拉多丹佛大學(xué)以及法國數(shù)值算法(集團(tuán))有限公司聯(lián)合開發(fā)的開源項(xiàng)目。其官方網(wǎng)站在:http://www.netlib.org/lapack/。

這個(gè)工具底層是由Fortran實(shí)現(xiàn)。有報(bào)告顯示,Fortran實(shí)現(xiàn)的矩陣計(jì)算要比C/C++還要快,因此這個(gè)庫的效率也是極高的。

由官網(wǎng)顯示,LAPACK曾多年受到Mathworks和Intel的攢助。

二、Matlab與Lapack

Matlab的官方文檔中其實(shí)清楚地說明了它和LAPACK之間的關(guān)系:

LAPACK(線性代數(shù)包)是一個(gè)例程庫,它為數(shù)值線性代數(shù)和矩陣計(jì)算提供快速、穩(wěn)健的算法。MATLAB? 中的線性代數(shù)函數(shù)和矩陣運(yùn)算均基于 LAPACK 構(gòu)建,并且繼續(xù)受益于其例程的性能和精度。1

另外,關(guān)于他們的歷史還有一些簡要的介紹:

MATLAB 誕生于 20 世紀(jì) 70 年代后期,是一款基于 LINPACK 和 EISPACK 構(gòu)建的交互式計(jì)算器,而 LINPACK 和 EISPACK 在當(dāng)時(shí)是進(jìn)行矩陣計(jì)算的最先進(jìn)的 Fortran 子例程庫。多年來,MATLAB 使用了 LINPACK 和 EISPACK 的十幾個(gè) Fortran 子例程的 C 語言版本。

2000 年,MATLAB 改用 LAPACK,這是 LINPACK 和 EISPACK 的現(xiàn)代替代品。它是一個(gè)用于數(shù)值線性代數(shù)的大型、多作者 Fortran 庫。LAPACK 最初是為在超級計(jì)算機(jī)上使用而設(shè)計(jì)的,因?yàn)樗軌蛞淮斡?jì)算矩陣的多個(gè)列。LAPACK 例程的速度與基本線性代數(shù)子例程 (BLAS) 的速度密切相關(guān)。BLAS 版本通常特定于硬件并經(jīng)過高度優(yōu)化。

三、Python(Numpy, Scipy)與Lapack

在Numpy官網(wǎng)中明確就寫著這么幾個(gè)大字:

NumPy – A Replacement for MatLab

這個(gè)的確有點(diǎn)囂張。

在它的文檔中也能明確看到,它底層的矩陣計(jì)算全部來自LAPACK。

四、明白上述關(guān)系對我們有何用處

介紹上述內(nèi)容根本上就是為我們實(shí)操提供指導(dǎo)的,那么他們之間的這種關(guān)系能為我們帶來哪些啟示?

  • 功能上

Matlab作為老牌數(shù)值計(jì)算工具,其功能豐富無比。Numpy雖然如此囂張地說要替代Matlab但這底氣實(shí)在還是不足。上述關(guān)系表明它們在底層數(shù)值矩陣模塊都是基于同一個(gè)基庫,但并不代表在其基礎(chǔ)之上的開發(fā)是同一個(gè)量級和水平的。

當(dāng)然,從另一個(gè)方面來說,正因?yàn)樗鼈兊幕鶐焓且粯拥?#xff0c;因此在某些具有相同或者相似功能的模塊上它們的功能是可以完全等效的。這一點(diǎn)非常重要!因?yàn)檫@就意味著只要是Numpy具有的功能,基本上就可以認(rèn)為它和Matlab是基本等效的,因此就可以節(jié)省大量的測試時(shí)間。

這件事情我們之前也做過一些簡單的工作,比如:深度對比Python(Numpy,Scipy)與Matlab的數(shù)值精度。這篇報(bào)告里就十分細(xì)致地對比了二者在解線性方程組中的精度,最后發(fā)現(xiàn)其結(jié)果完全一致(精確到最后一位有效的小數(shù)位上)。

那么從這個(gè)角度上講,Numpy在某些計(jì)算問題上替代Matlab也是完全可行的!

  • 效率上

許多人都抱怨Matlab很慢,當(dāng)然更多人也在抱怨Python很慢。但這二者的慢都有一個(gè)共同的特點(diǎn):在運(yùn)行其自身的模塊時(shí)就非常慢!最典型的就是用它們寫循環(huán),比起C完全就不是一個(gè)量級。

但注意到前面所說的:Fortran的矩陣計(jì)算效率甚至是要快過純C/C++的!那么這就意味著,如果我們能夠盡可能地利用LAPACK模塊進(jìn)行計(jì)算,那么運(yùn)算效率就一定能上去!

比如機(jī)器學(xué)習(xí)庫sklearn,其底層就是直接依賴Numpy。但我們在實(shí)踐中也不難發(fā)現(xiàn)sklearn的效率極高。這就是因?yàn)樗谧鰪?fù)雜的計(jì)算的時(shí)候主要都是在調(diào)用LAPACK的模塊。

那么從技巧上講,最簡單的方法其實(shí)就是向量化。因?yàn)橄蛄炕梢詷O大減少循環(huán)的使用,從而就能夠使盡可能多的計(jì)算都由LAPACK來實(shí)現(xiàn),而不是用Matlab或者Python自帶的循環(huán)來實(shí)現(xiàn)。

另外,筆者也做過一些測試,比如一個(gè)簡單的矩陣乘法。如果用Matlab的循環(huán)來實(shí)現(xiàn),大概比直接用Matlab的矩陣乘法多1000倍以上的時(shí)間。

我曾經(jīng)也試過修改過一個(gè)算法,向量化過后在1W量級的數(shù)據(jù)集上可以將運(yùn)算時(shí)間從30分鐘降低到30秒左右。

  • 關(guān)于Python和Matlab的效率

目前關(guān)于這2種語言的速度的對比也有不少了,這里就不太多說。總體感覺二者在不同的問題上還是各有不同的表現(xiàn)。但這里需要強(qiáng)調(diào)的一些問題是:

? (1)Matlab是一個(gè)統(tǒng)一框架的軟件,而Python的各種對比本質(zhì)上是各種庫的對比,因此單說誰快誰慢其實(shí)都是不太嚴(yán)謹(jǐn)?shù)摹?/p>

? (2)Matlab作為一款成熟的商業(yè)軟件,其相關(guān)的配套功能也是比較健全的。在運(yùn)行效率上有個(gè)很明顯的特點(diǎn)就是:它優(yōu)化了硬件層面的保護(hù),因此在進(jìn)行大規(guī)模計(jì)算時(shí)不會盡最大努力去壓榨硬件的能力,因此在一些大量問題的時(shí)候可能會顯得慢一些。但這種保護(hù)同時(shí)也帶來了更高的穩(wěn)定性。相反,Python的各種庫(包括Numpy和Scipy),本質(zhì)上都是以功能導(dǎo)向的。并不會對硬件層面進(jìn)行太多優(yōu)化,因此它會放任程序?qū)τ布M(jìn)行最大程度的壓榨。所以在具體使用時(shí)也需要注意這個(gè)問題。

筆者曾多次使用Python的joblib模塊來進(jìn)行并行計(jì)算。讓我體會最深刻的是一旦運(yùn)算量較大,CPU的溫度就會飚升,甚至觸發(fā)操作系統(tǒng)自帶的硬件保護(hù)機(jī)制(有時(shí)是魯大師的高溫報(bào)警)。這一點(diǎn)可能也不是什么好事,因?yàn)檫@樣會明顯折損硬件的壽命。因此在使用時(shí)要特別注意。

五、寫在最后

簡單說完了Matlab和Python(Numpy, Scipy)與LAPACK之間的關(guān)系并分析了一些用處。從上述分析不難看到,了解這些“周邊”知識對我們的工作和學(xué)習(xí)實(shí)際上也是有不小的幫助的。由于Python和LAPACK的這種關(guān)系,使得它其實(shí)也可以做一些科學(xué)計(jì)算的工作。Matlab由于底層調(diào)用LAPACK,因此也能提高效率。

本文的介紹和分析還很窄,今后如果有機(jī)會還可以更加深入地討論這些問題。


  • https://ww2.mathworks.cn/help/matlab/math/lapack-in-matlab.html ??

  • 總結(jié)

    以上是生活随笔為你收集整理的Matlab和Python(Numpy,Scipy)与Lapack的关系的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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