python numba讲解

  因为python有动态解释性语言的特性,跑起代码来相比java、c++要慢不少,尤为在作科学计算的时候,十亿百亿级别的运算,让python的这种劣势更加凸显。

  所以就出现了解决python慢的一大利器numba,可让python的运行速度提高上百倍甚至更多!

  numpy是为面向numpy数组的计算任务而设计的。

  Numba把NumPy数组类型生成高效的编译代码,用于在GPU或多核CPU上执行。

  在作大量科学计算时和使用for循环数据较多时,尽可能使用numba。


java

一:什么是numba

  numba是一款能够将python函数编译为机器代码的JIT编译器,通过numba编译的python代码(仅限数组运算),其运行速度能够接近C或FORTRAN语言。


  numba的做用是给python换一种编译器。让代码直接转成机器码运行。


python

二:如何使用numba

  使用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代码有很大帮助,对数据科学工做者来讲,这真是一个好技术!

相关文章
相关标签/搜索