溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎么加速python腳本

發(fā)布時(shí)間:2021-09-04 21:04:26 來源:億速云 閱讀:170 作者:chen 欄目:大數(shù)據(jù)

本篇內(nèi)容主要講解“怎么加速python腳本”,感興趣的朋友不妨來看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“怎么加速python腳本”吧!

因?yàn)榻谝獙懬短譮or循環(huán),由于運(yùn)算量有點(diǎn)大,耗時(shí)比較久。所以就在谷歌上搜了搜有沒有辦法可以提升python for loop的速度,然后就發(fā)現(xiàn)了非常好用的模塊:Numba
   

Numba makes Python code fast

官方網(wǎng)址:http://numba.pydata.org/

首先如果你沒安裝的話,可以通過pip install numba --user裝一下,或者如果你已經(jīng)安裝了Anaconda3的話,那直接用conda安裝的python3就有這個(gè)模塊。

tips:用anaconda管理模塊、軟件,解決環(huán)境沖突問題,省時(shí)省力,附上linux上的安裝小教程
# download from tsinghua mirror sitewget https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-5.3.1-Linux-x86_64.sh# check the help messagebash Anaconda3-5.3.1-Linux-x86_64.sh -h# then install or install into Nonexistent Custom Directory by adding -pbash Anaconda3-5.3.1-Linux-x86_64.sh# add to the environmentecho ". /home/saber/anaconda3/etc/profile.d/conda.sh" >> ~/.bashrc

Numba的用法很簡(jiǎn)單,一般是加速某個(gè)函數(shù)。如果你想加速函數(shù)x,只需要在定義函數(shù)x的時(shí)候,在def前一行加上一個(gè)裝飾器@jit就行了(就簡(jiǎn)單的一行代碼)。

下面以筆者寫的小例子進(jìn)行介紹,這個(gè)例子主要計(jì)算a1到a2所有數(shù)的加和,并用time模塊來檢測(cè)函數(shù)的運(yùn)行時(shí)間:

from numba import jitimport time
#define function A without numbadef func_A(a1,a2): A_result=0 for i in range(a1,a2):  A_result+=i return A_result
#define func A1 with numba#just add the @jit@jitdef func_A1(a1,a2): A1_result=0 for i in range(a1,a2):  A1_result+=i return A1_result
#record the elasped timedef time_func(func_A_i,*args): start = time.time() func_A_i(*args) end = time.time() print("Elasped time of func %s is %.4e"%(func_A_i.__name__,end-start))

time_func(func_A,1,10000000)time_func(func_A,1,10000000)print()time_func(func_A1,1,10000000)time_func(func_A1,1,10000000)

其實(shí)能發(fā)現(xiàn)兩個(gè)函數(shù)的主體是完全一樣的,最主要的不同是在func_A1前面加了一句@jit。

運(yùn)行結(jié)果如下:

Elasped time of func func_A is 5.4757e-01Elasped time of func func_A is 5.3267e-01
Elasped time of func func_A1 is 5.3686e-02Elasped time of func func_A1 is 4.7684e-06

細(xì)心的讀者可能發(fā)現(xiàn)了,我對(duì)每個(gè)函數(shù)都運(yùn)行了2次,func_A的時(shí)間幾乎一致,func_A1第二次的時(shí)間比第一次少了四個(gè)數(shù)量級(jí),這是因?yàn)榈诙蔚臅r(shí)間才是numba加速后函數(shù)執(zhí)行的時(shí)間。

通俗理解,numba第一次讀取函數(shù)時(shí),會(huì)將函數(shù)轉(zhuǎn)換為計(jì)算更快的語言,這是編譯的過程,會(huì)消耗一些時(shí)間,之后numba將編譯存儲(chǔ)起來,下次遇見同類型的數(shù)據(jù),直接讀取編譯,計(jì)算得到結(jié)果。官方解釋如下:

First, recall that Numba has to compile your function for the argument types given before it executes the machine code version of your function, this takes time. However, once the compilation has taken place Numba caches the machine code version of your function for the particular types of arguments presented. If it is called again the with same types, it can reuse the cached version instead of having to compile again.

所以總的來說numba加速后速度提升還是很大的,特別是對(duì)有想加速python腳本需求的人來說。

到此,相信大家對(duì)“怎么加速python腳本”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI