zoukankan      html  css  js  c++  java
  • python numba讲解

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

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

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

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

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


    一:什么是numba

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


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


    二:如何使用numba

      使用numba非常简单,只需要将numba装饰器应用到python函数中,无需改动原本的python代码,numba会自动完成剩余的工作。那么怎么使用呢,下面有一个例子。


    1.计算numpy数组各个数值的双曲正切值。


    (1)导入numpy、numba及其编译器

    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倍。

    2.nunba对for循环的加速
    (1)代码

    # 普通函数
    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代码有很大帮助,对数据科学工作者来说,这真是一个好技术!

  • 相关阅读:
    1451. Rearrange Words in a Sentence
    1450. Number of Students Doing Homework at a Given Time
    1452. People Whose List of Favorite Companies Is Not a Subset of Another List
    1447. Simplified Fractions
    1446. Consecutive Characters
    1448. Count Good Nodes in Binary Tree
    709. To Lower Case
    211. Add and Search Word
    918. Maximum Sum Circular Subarray
    lua 时间戳和时间互转
  • 原文地址:https://www.cnblogs.com/ITXiaoAng/p/11704278.html
Copyright © 2011-2022 走看看