目录javascript
因为python有动态解释性语言的特性,跑起代码来相比java、c++要慢不少,尤为在作科学计算的时候,十亿百亿级别的运算,让python的这种劣势更加凸显。
所以就出现了解决python慢的一大利器numba,可让python的运行速度提高上百倍甚至更多!
numpy是为面向numpy数组的计算任务而设计的。
Numba把NumPy数组类型生成高效的编译代码,用于在GPU或多核CPU上执行。
在作大量科学计算时和使用for循环数据较多时,尽可能使用numba。
java
numba是一款能够将python函数编译为机器代码的JIT编译器,通过numba编译的python代码(仅限数组运算),其运行速度能够接近C或FORTRAN语言。
numba的做用是给python换一种编译器。让代码直接转成机器码运行。
python
使用numba很是简单,只须要将numba装饰器应用到python函数中,无需改动本来的python代码,numba会自动完成剩余的工做。那么怎么使用呢,下面有一个例子。
1.计算numpy数组各个数值的双曲正切值。
(1)导入numpy、numba及其编译器c++
import numpy as np import numba from numba import jit
(2)传入numba装饰器jit,编写函数数组
# nopython = True 选项要求彻底编译该函数(以便彻底删除Python解释器调用),不然会引起异常 @jit(nopython=True) # jit,numba装饰器中的一种 def go_fast2(a): # 首次调用时,函数被编译为机器代码 trace = 0 # 假设输入变量是numpy数组 for i in range(a.shape[0]): # Numba 擅长处理循环 trace += np.tanh(a[i, i]) # numba喜欢numpy函数 return a + trace # numba喜欢numpy广播
(3)给函数传递实参函数
# 由于函数要求传入的参数是nunpy数组 x = np.arange(100).reshape(10, 10) # 执行函数 go_fast(x)
(4)经numba加速的函数执行时间大数据
% timeit go_fast(x)
(5)结果输出设计
3.63 µs ± 156 ns #加速后 136 µs ± 1.09 µs #不加速
快了40倍。code
2.nunba对for循环的加速
(1)代码ip
# 普通函数 def go_fast1(): # 首次调用时,函数被编译为机器代码 x = 0 for i in np.arange(5000): x += i return x # nopython = True选项要求彻底编译该函数(以便彻底删除Python解释器调用),不然会引起异常 @jit(nopython=True) # jit,numba装饰器中的一种 def go_fast2(): # 首次调用时,函数被编译为机器代码 x = 0 for i in np.arange(5000): x += i return x
(2)结果输出
1.57 µs ± 53.8 ns #加速后 408 µs ± 9.73 µs #不加速
快了200倍。 numba对python代码运行速度有巨大的提高,这极大的促进了大数据时代的python数据分析能力,但不会对numpy和for循环之外的python代码有很大帮助,对数据科学工做者来讲,这真是一个好技术!