numba安装与使用

2023-05-16

一、numba是什么

Numba是一个针对Python的开源JIT编译器,由Anaconda公司主导开发,可以对Python原生代码进行CPU和GPU加速。Numba对NumPy数组和函数非常友好。解释器可以参考第四章内容。

CUDA C编程开发成本高,所以一般会用python先尝试加速模型训练。numba包就是python提供的GPU编程开发包。只管调用就对了。

除此之外还有很多,比方说等价于numpy的cupy,用于矩阵运算,pycuda之类的,tensorflow,pytorch等等。

参考这篇文章:numba与cupy

二、numba下载与安装

使用conda安装Numba:

$ conda install numba

或者使用pip安装:

$ pip install numba

三、numba的使用

使用方法很简单,想写好真不容易!!!

from numba import jit
import numpy as np

a = np.arange(10)
b = np.arange(1,11)

@jit
def test():
    return a+b

test()

我们只需要在原来的代码上添加一行@jit,即可将一个函数编译成机器码,其他地方都不需要更改。@符号装饰了原来的代码,所以称类似写法为装饰器。

这里装饰的函数调用的API是有限制的!!!!比如pandas是更高层次的封装,Numba其实不能理解它里面做了什么,所以无法对其加速。一些大家经常用的机器学习框架,如scikit-learn,tensorflow,pytorch等,已经做了大量的优化,不适合再使用Numba做加速。

此外,Numba不支持:try…except 异常处理,with 语句,类定义class,yield from

Numba的@jit装饰器就像自动驾驶,用户不需要关注到底是如何优化的,Numba去尝试进行优化,如果发现不支持,那么Numba会继续用Python原来的方法去执行该函数,即图 Python解释器工作原理中左侧部分。这种模式被称为object模式。

Numba真正牛逼之处在于其nopython模式。将装饰器改为@jit(nopython=True)或者@njit,Numba会假设你已经对所加速的函数非常了解,强制使用加速的方式,不会进入object模式,如编译不成功,则直接抛出异常。nopython的名字会有点歧义,我们可以理解为不使用很慢的Python,强制进入图 Python解释器工作原理中右侧部。简而言之,无脑nonpython模式就对了!!!!

注意点一

Numba库提供的是一种懒编译(Lazy Compilation)技术,即在运行过程中第一次发现代码中有@jit,才将该代码块编译。用到的时候才编译,看起来比较懒,所以叫懒编译。使用Numba时,总时间 = 编译时间 + 运行时间。相比所能节省的计算时间,编译的时间开销很小,所以物有所值。对于一个需要多次调用的Numba函数,只需要编译一次,后面再调用时就不需要编译了。

注意点二

原生Python速度慢的另一个重要原因是变量类型不确定。声明一个变量的语法很简单,如a = 1,但没有指定a到底是一个整数和一个浮点小数。Python解释器要进行大量的类型推断,会非常耗时。同样,引入Numba后,Numba也要推断输入输出的类型,才能转化为机器码。针对这个问题,Numba给出了名为Eager Compilation的优化方式。

from numba import jit, int32

@jit("int32(int32, int32)", nopython=True)
def f2(x, y):
    return x + y

@jit(int32(int32, int32))告知Numba你的函数在使用什么样的输入和输出,括号内是输入,括号左侧是输出。这样不会加快执行速度,但是会加快编译速度,可以更快将函数编译到机器码上。

具体用法参考皮皮鲁的科技星球

调用cuda,不需要选择njit修饰器,用cuda.jit即可

from numba import cuda
@cuda.jit
def gpu_add(a, b, result, N):
    idxWithinGrid = cuda.threadIdx.x + cuda.blockIdx.x * cuda.blockDim.x 
    gridStride = cuda.gridDim.x * cuda.blockDim.x
    for i in range(idxWithinGrid, N, gridStride):
        result[i] = a[i] + b[i]

四、numba的原理

python慢的原因主要是因为解释器。解决办法有俩个,一种解决办法是使用C/C++语言重写Python函数,但是这要求程序员对C/C++语言熟悉,且调试速度慢,不适合绝大多数Python程序员。另外一种非常方便快捷的解决办法就是使用Just-In-Time(JIT)技术。

Just-In-Time(JIT)技术为解释语言提供了一种优化,它能克服上述效率问题,极大提升代码执行速度,同时保留Python语言的易用性。使用JIT技术时,JIT编译器将Python源代码编译成机器直接可以执行的机器语言,并可以直接在CPU等硬件上运行。这样就跳过了原来的虚拟机,执行速度几乎与用C语言编程速度并无二致。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

numba安装与使用 的相关文章

随机推荐

  • Markdown编辑器中对图片居中和调整大小的方法

    图片居中 博主本人在写了200余篇垃圾博文后逐渐发现 xff0c 插入的图片还是居中看起来比较美观 Markdown编辑器中对图片进行编辑的方法有很多 xff0c 最简单的方法如下 xff1a 此处添加图片描述 此处添加图片URL地址 pi
  • [ Cesium ] 根据 TLE 生成 czml 的三种方式

    文章目录 一 使用 python tle2czml 库生成二 手动爬虫三 使用 python requests 库获取四 备注 一 使用 python tle2czml 库生成 span class token keyword import
  • [ Hbase ] 单机独立安装

    文章目录 下载 Hbase安装 Hbase启动 HbaseJava API 连接 下载 Hbase http apache mirror cdnetworks com hbase span class token builtin class
  • [ Spark ] java.lang.NoSuchMethodError: com.google.common.hash.Funnels.stringFunnel

    文章目录 问题解决两种方式一 初始化 spark 时 xff0c 设置优先使用 jar 包中的依赖二 使用 shade 插件 参考链接 问题 相关环境参数 spark version xff1a 2 1 0 scala version xf
  • [ Neo4j ] Docker 安装与 Python 操作

    文章目录 安装运行Python 操作简单示例 安装 使用 docker 安装 Neo4j拉取最新的 Neo4j 镜像 docker pull neo4j 运行 运行 Neo4j 容器 docker run it d p span class
  • Windows和Linux之间如何传递数据|两台Linux之间如何传递数据

    摘要 xff1a 我们租用了一台服务器 xff0c 然后我们想要把我们写的项目上传到自己的Linux服务器中 xff0c 那么我们应该怎么上传呢 xff1f 如果我们想要从服务器中下载一些资料 xff0c 那么又该如何进行呢 xff1f 看
  • mac M1使用goland无法进行调试

    首先查看go的版本查看是否是arm版本的eg xff1a go version go version go1 16 13 darwin arm64 然后查看你的goland版本是否是Apple Sillicon版本 下载apple版本的go
  • 忘了自己是从哪里下载的源码?查看git clone的历史

    有时候忘记自己是从哪个地方下载的源码了 xff0c 这时候可以进入git clone的文件夹根目录 xff0c 在该处打开终端并输入 span class token function git span reflog date span c
  • 【详细步骤】Ubuntu18.04开启SSH服务,使用MobaXterm客户端进行远程登录

    熟悉linux的小伙伴 xff0c 都或多或少会接触到ssh服务 使用MobaXterm远程登录Ubuntu那感觉 xff0c 真是太 爽了 本人推荐此方法原因如下 xff1a 1 颜控 xff0c Ubuntu原生界面太丑 2 方便 xf
  • cuda-trt 学习

    https github com jinmin527 learning cuda trt learning cuda trt A large number of cuda tensorrt cases在这个project中 xff0c 提供
  • 时序知识图谱推理:Know-Evolve: Deep Temporal Reasoning for Dynamic Knowledge Graphs

    0摘要 xff1a 带有时间戳的大规模事件数据的可用性催生了边带有时间的动态知识图谱 在动态的知识图谱中 xff0c 并没有被很好的理解 基于此 xff0c 本文提出Know Evolve xff0c 这是一种新颖的深度进化知识网络 xff
  • 《机器学习实战》源码和数据集的下载

    机器学习实战 这本书对于我们了解机器学习原理和代码实现提供了很大的帮助 xff0c 源码和数据集可在其英文版的官方网站进行下载 xff1a https www manning com books machine learning in ac
  • VNC Viewer :Timed out waiting for a response from the computer

    阿里云主机 xff0c Ubuntu系统 xff0c 通过VNC viewer连接出现超时问题 解决方案 xff1a 首先检查在阿里云主机添加5801 5810 xff1b 5901 5910端口是否开启 查找步骤如下图 xff1a 1 点
  • 从零开始系列(二):数据库基础篇

    从零开始系列 xff08 二 xff09 xff1a 数据库基础篇 相关系列文章推荐 xff1a 从零开始系列 xff08 一 xff09 xff1a 在github上搭建自己的博客 从零开始系列 xff08 三 xff09 xff1a W
  • 从零开始系列(三):Windows10安装Linux子系统(WSL教程)

    从零开始系列 xff08 三 xff09 xff1a Windows10安装Linux子系统 xff08 WSL教程 xff09 相关系列文章推荐 xff1a 从零开始系列 xff08 一 xff09 xff1a 在github上搭建自己的
  • 从零开始系列(四):一文看懂arm架构和x86架构有什么区别

    从零开始系列 xff08 四 xff09 xff1a 一文看懂arm架构和x86架构有什么区别 相关系列文章推荐 xff1a 从零开始系列 xff08 一 xff09 xff1a 在github上搭建自己的博客 从零开始系列 xff08 二
  • NVIDIA显卡及架构介绍

    版权申明 未经博主同意 xff0c 谢绝转载 xff01 xff08 请尊重原创 xff0c 博主保留追究权 xff09 xff1b 本博客的内容来自于 xff1a NVIDIA显卡及架构介绍 xff1b 学习 合作与交流联系q384660
  • 脉冲神经网络资料汇总

    往期文章推荐 xff1a 损失函数与代价函数 神经网络从入门到精通 脉冲神经网络综述笔记 版权申明 未经博主同意 xff0c 谢绝转载 xff01 xff08 请尊重原创 xff0c 博主保留追究权 xff09 xff1b 本博客的内容来自
  • 什么是NAS

    一 NAS是什么 简单的说就是连接在网络上 xff0c 让大家可以透过网络 xff08 内网 xff0c 外网 xff09 来进行储存和读取资料的设备 通俗点说 xff0c 就是有一台很小很小的台式主机 xff0c 里面只装了很多颗的磁盘
  • numba安装与使用

    一 numba是什么 Numba是一个针对Python的开源JIT编译器 xff0c 由Anaconda公司主导开发 xff0c 可以对Python原生代码进行CPU和GPU加速 Numba对NumPy数组和函数非常友好 解释器可以参考第四