python加速器numba使用详解
_刘文凯_ 人气:0python的一个加速器包,这里不讲原理,只讲应用过程,以及给出几个小例子,直接写就行了; 另外还给出了numba如何定义使用List
1、最简单的使用
当输出返回值为整数或浮点数时:
from numba import jit @jit(nopython=True) def f(x, y): return x+y if __name__ == '__main__': a = 1 b = 1 print(f(a,b))
解释:
使用装饰器,另外,nopython=True是防止numba自动更改加速模式,也就是使用nopython。
上述代码等价于:
from numba import njit @njit # 也就是jit(nopython=True) def f(x, y): return x+y if __name__ == '__main__': a = 1 b = 1 print(f(a,b))
2、进阶
当输出返回值为“不同类型值”时:
装饰器使用:generated_jit
from numba import generated_jit, typed @generated_jit(nopython=True) def f2(x): if x==1: return lambda x: x+1 else: return lambda x: [1,2] if __name__ == '__main__': a = 1 print(f2(a))
当进行矩阵或向量运算时:
使用装饰器:vectorize
from numba import vectorize, float64 import numpy as np @vectorize([float64(float64, float64)]) # 注意有中括号 def f(x, y): return x + y if __name__ == '__main__': a = np.array([1,2]) b = np.array([2,2]) print(f(a,b))
补充
在numba内定义列表:
import numpy as np import time NUM = 160 from numba import jit from numba.typed import List a = List() a.append(1) # 同样需要指定数据类型,塞个1,数据类型就是int @jit(nopython=True) def f(a): for i in range(NUM): a.append(i) if __name__ == '__main__': for i in range(5): start = time.time() f(a) print(time.time()-start)
加载全部内容