1、Numba库介绍
Numba是一款可以在运行时把python函数编译为机器码的JIT编译器。
经过Numba编译的python代码(仅限数组运算),其运行速度可以接近C或FORTRAN语言。
普通python语言靠CPython编译的,但是Numba使用Jit编译器可以直接将一个函数转化为机器码。
用于提升数组运算速度。
Numba最初是由开发Anaconda的Continuum Analytics开发的。
2、Numba库的安装
pip install numba
3、Numba的使用
import numba
import numpy as np
from numba import jit
import time
def sum_matrix(M):
N1,N2 = M.shape
result = 0
for i in range(N1):
for j in range(N2):
result+=M[i][j]
def sum_numpy(M):
return np.sum(M)
def sum_jit(M):
sum_matrix_jit = jit()(sum_matrix)
return sum_matrix_jit
def print_run_time(func,M,loops):
start = time.time()
for _ in range(loops):
func(M)
end = time.time()
print('current Function [%s] run time is %.2f' % (func.__name__ ,end - start))
if __name__ == '__main__':
np.random.seed(1234)
M = np.random.random([int(4e3)]*2)
loops = 5
print_run_time(sum_matrix,M,loops)
print_run_time(sum_numpy,M,loops)
print_run_time(sum_jit,M,loops)
current Function [sum_matrix] run time is 57.13
current Function [sum_numpy] run time is 0.16
current Function [sum_jit] run time is 0.10
4、使用jit装饰器
@jit(nopython=True) #能获得最佳性能。函数的运行与Python解释器完全无关,不会调用Python的C语言API。
jit转换函数更常用装饰器的写法:
@jit
def sum_matrix_jit(M):
N1, N2 = M.shape
result = 0
for i in range(N1):
for j in range(N2):
result += M[i, j]
return result
针对数值运算的python函数,只需要添加简单的@jit装饰器,就可以让运行速度大幅提升
@jit提供了参数选项,如果在jit的参数中指定了输入输出的类型,可以轻微提升速度
@jit(float64(int32, int32))
def f(x, y):
return (x + y) / 3.14
本文介绍了Numba库,一款能在运行时将Python函数编译为机器码的JIT编译器,尤其适用于提升数组运算的速度。通过示例对比了普通Python函数、使用NumPy的函数及使用Numba装饰器后的函数在执行效率上的差异。

1137

被折叠的 条评论
为什么被折叠?



