python numba提公升程式效率

2021-10-06 03:51:23 字數 1798 閱讀 9645

是什麼

numba是乙個的即時編譯器(just-in-time compiler)。即它能在程式執行時,使用llvm編譯器庫將python函式轉換為優化的機器碼。從而使得執行速度可以達到c或fortran的速度。

怎麼用

只需用numba去修飾python函式即可。換言之,不需要替換python直譯器、執行單獨的編譯步驟、安裝c/ c++編譯器等額外操作。

問題描述

對於矩陣連乘:un.

..u2

u1

ρu_n...u_2u_1\rho

un​...

u2​u

1​ρ, 原方法是用for迴圈累乘.測試下用numba.jit修飾後效率是否有提公升.

使用注意: array的資料型別必須一樣,否則會報錯.

例項**

def f(u, rho):

for i in range(len(u)):

rho = np.dot(u[i] ,rho)

@numba.jit(nopython=true)

def f_jit(u, rho):

for i in range(len(u)):

rho = np.dot(u[i] ,rho)

a = np.array([[0.1,0.2],[0.3,0.4]])

u = np.array([a]*500)

rho = np.array([[0.5,0.5],[0.5,0.5]])

%timeit f(gates, rho)

%timeit f_jit(gates, rho)

結果分析

對這個測試例項,提公升近3倍.

114 µs ± 1.31 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

38.6 µs ± 1.09 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

問題描述: 矩陣累加,測試用numba後,是否有效率提公升.

例項**

def f(a):

c = 0

for a in a:

c = c + a

return c

@numba.jit(nopython=true)

def f_jit(a):

c = np.zeros(a[0].shape,dtype=a.dtype)

for a in a:

c = c + a

return c

a=for i in range(1000):

a = np.random.uniform(-1,1,(16,16))

a = np.asarray(a)

%timeit f(a)

%timeit f_jit(a)

結果分析

對這個測試例項,提公升1-2倍

2.81 ms ± 44.6 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

1.05 ms ± 38 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)

通過 LLVM 加速 Python numba

numba是cython的競爭專案。同樣的,numba把python原始碼通過llvmpy生成jit後的.so檔案來加速。不同點 1.numba是以jit為主的,加速對原始碼的侵入性較小。2.cython則重點在加速高效能python模組的開發上,不依賴llvmpy專案。3.numba還很不成熟,目...

提公升程式設計師效率

筆者工作多年,總結了一些經驗,可以幫助大家成為乙個更加高效的程式設計師。程式設計法則,與設計和工程的原理密切相關。下面這些程式設計法則幫助我讓我獲益匪淺,所以我想分享給大家,希望也能幫助大家更高效,生產出的 更容易維護,並且bug和缺陷更少。dry原則 不要重複 don t repeat yours...

程式設計師的提公升

引用 1.太害怕學不會新的工具 語言和框架 一般的程式設計師會墨守他們最喜歡的工具,而不希望學習新的,因為他們認為,離開了那些語言和工具,多年的經驗就會付諸東流。而強大的程式設計師會擁抱那些挑戰和機會,積極地學習新的工作方式。2.直到特性 完成 的時候才會提交。但永遠都不會完成!他在markedup...