Numba:加速python代码

举报
xiaozr 发表于 2021/06/09 20:22:54 2021/06/09
【摘要】 Numba:加速python代码当代码中有很多math计算,使用numpy或者有很多loops时,numba可以加速代码最基础的是numba jit修饰器@jitfrom numba import jitimport numpy as npx = np.arange(100).reshape(10, 10)@jit(nopython=True) # Set "nopython" mode ...

Numba:加速python代码

当代码中有很多math计算,使用numpy或者有很多loops时,numba可以加速代码

最基础的是numba jit修饰器@jit

from numba import jit
import numpy as np

x = np.arange(100).reshape(10, 10)

@jit(nopython=True) # Set "nopython" mode for best performance, equivalent to @njit
def go_fast(a): # Function is compiled to machine code when called the first time,第一次运行会被编译成机器码
    trace = 0.0
    for i in range(a.shape[0]):   # Numba likes loops
        trace += np.tanh(a[i, i]) # Numba likes NumPy functions
    return a + trace              # Numba likes NumPy broadcasting

print(go_fast(x))

nopython

@jit以两种编译模式进行,nopython编译模型实质上是编译经过修饰的函数,使得函数可以直接运行而不需要python解释器(在命令行下运行python就是启动cython解释器,cython是使用最广的python解释器)的参与。

numba工作流程

numba读取装饰函数的python字节码,并结合输入参数类型,使用LLVM编译器生成针对cpu功能量身定制的机器代码版本,然后每次调用函数会使用编译版本

numba也可以实现CUDA编程,可以使用纯python编写的内核,并让numba处理计算和数据移动

性能技巧

  • loop
  • 在IEEE 754合规性不太重要时,可以放宽数字上的严谨性,来获得额外的性能,实现方式为 fastmath=True
  • 如果代码包含可并行化操作,numba可以编译多线程版本,实现方式为parallel=True
    • 按元素或按点数组操作
      • 一元运算符: + - ~
      • 二进制运算符: + - * / % | >> << ^ & // **
      • 比较运算符:== != < > <= >=
      • 在nopython模式下支持Numpy ufuncs
      • 用户DUFunc通过定义vectorize()
    • numpy的规约函数sum prod min max argmin argmax
    • numpy dot
    • 维度相同时,多维数组也支持以上操作,不支持混合维度数组进行numpy广播,也不支持选定维度上进行规约

支持的python功能

  • 语言
    • 支持的结构
      • if ... elif ... else ...
      • while for .. in break continue
      • yield
      • assert
    • 部分受支持的结构
      • try .. except raise else finally
      • 上下文管理器
      • 列表理解
    • 不支持的构造
      • 异步
      • 类定义
      • 集合,字典,生成器理解
      • 发电机委托 yield from
  • 内置类型
    • 元祖
    • 列表
    • 字典等

支持Numpy功能

  • 标量类型
    • 整数
    • 布尔
    • 实数复数等
  • 数组类型
    • 阵列存取
    • 属性
      • shape size ndim dtype
    • 计算
      • all() any() argmax() argmin() mean() min()
    • 其他方法
      • argsort()
      • astype() (仅一个参数形式)
      • copy() (无参数)
      • dot() (仅一个参数)等
    • 基本线性代数
      • 在浮点数和复数的一维和二维连续数组上支持
    • 其他功能
      • numpy.append()
      • numpy.arange()
      • numpy.ones()

参考文档:https://numba.readthedocs.io/en/stable/reference/numpysupported.html

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。