当前位置: 首页 > news >正文

Numba基础

1. Numba 基础

1.1 什么是 Numba?

Numba 是一个 JIT 编译器,用于加速数值计算。它通过即时编译技术,将 Python 代码在运行时编译为机器代码,极大地提升执行速度,特别适合循环和矩阵操作等密集型计算。


2. Numba 基本使用

2.1 @jit 装饰器

@jit 装饰器是 Numba 的基本加速手段,它将被装饰的函数动态编译为机器码,以提高性能。如果设置 nopython=True,它会进入无 Python 模式,完全避免 Python 的解释开销。

示例代码:

import numpy as np
from numba import jit# 使用 @jit 加速计算,启用 nopython 模式,保证最高的性能
@jit(nopython=True)
def sum_array(arr):total = 0for i in arr:  # 遍历数组元素并累加total += ireturn total# 生成一个随机的大型数组作为输入数据
data = np.random.rand(1000000)# 执行加速后的函数并输出结果
result = sum_array(data)
print(f"Sum result: {result}")

解释:

  • @jit(nopython=True) 指示 Numba 进入无 Python 模式,避免 Python 解释器的参与,获得最大性能提升。
  • sum_array 是一个简单的数组求和函数,由于使用了循环操作,因此 Numba 能够大幅加速执行。
2.2 @njit 装饰器

@njit@jit(nopython=True) 的简写,功能相同,确保 Numba 进入无 Python 模式。

from numba import njit# 使用 @njit 直接进入无 Python 模式
@njit
def multiply_array(arr):total = 1for i in arr:  # 遍历数组元素并累乘total *= ireturn total# 生成随机数组并计算其元素的乘积
data = np.random.rand(1000000)
result = multiply_array(data)
print(f"Product result: {result}")

解释:

  • @njit 是一个简便的写法,相当于 @jit(nopython=True),用于自动加速函数。
  • 这里的 multiply_array 函数执行数组的累乘操作,Numba 对这种循环密集型任务有显著的加速效果。

3. Numba 与 NumPy

Numba 对 NumPy 的支持非常友好,它能够识别并加速 NumPy 的许多函数,特别是在处理大型矩阵和数组时,可以极大提升性能。

示例代码:使用 NumPy 和 Numba 加速矩阵运算

import numpy as np
from numba import njit# 使用 Numba 加速矩阵乘法
@njit
def matrix_mult(A, B):# 初始化结果矩阵为零矩阵C = np.zeros((A.shape[0], B.shape[1]))# 三重循环执行矩阵乘法for i in range(A.shape[0]):for j in range(B.shape[1]):for k in range(A.shape[1]):# 将A的行与B的列相乘累加C[i, j] += A[i, k] * B[k, j]return C# 生成两个500x500的随机矩阵
A = np.random.rand(500, 500)
B = np.random.rand(500, 500)# 执行加速后的矩阵乘法
C = matrix_mult(A, B)
print(C)

解释:

  • 这里的 matrix_mult 是一个经典的三重循环矩阵乘法实现。由于是循环密集型操作,Numba 能够对其进行有效加速。
  • 函数内使用了 NumPy 的 np.zeros 来初始化结果矩阵,这也是被 Numba 支持并优化的 NumPy 操作。

4. Numba 并行化

Numba 提供了并行化支持,允许在多核 CPU 上同时执行任务,提升性能。通过 @njit(parallel=True)prange,你可以轻松并行化代码中的循环。

4.1 使用 prange 并行化

prange 是并行版本的 range,可以将循环的不同部分分配到多个线程中执行。

示例代码:并行化求和

from numba import njit, prange
import numpy as np# 使用并行化加速求和
@njit(parallel=True)
def parallel_sum(arr):total = 0# 使用 prange 代替 range 实现并行化循环for i in prange(len(arr)):total += arr[i]  # 各线程并行计算不同部分的数组求和return total# 生成随机数组
data = np.random.rand(1000000)# 执行并行求和
result = parallel_sum(data)
print(f"Parallel Sum Result: {result}")

解释:

  • prangerange 的并行版本,它将循环拆分为多个线程并行执行,从而充分利用多核 CPU。
  • @njit(parallel=True) 告诉 Numba 对这个函数进行并行优化。
4.2 并行化向量运算

对于一些简单的向量操作,比如数组归一化,Numba 的并行化也能提供很好的加速。

示例代码:并行化的数组归一化

@njit(parallel=True)
def normalize(arr):n = len(arr)result = np.empty(n)  # 初始化结果数组total = 0# 第一次并行循环计算数组的总和for i in prange(n):total += arr[i]mean = total / n  # 计算平均值# 第二次并行循环进行归一化操作for i in prange(n):result[i] = arr[i] / mean  # 将每个元素除以均值return result# 生成随机数组并进行归一化
data = np.random.rand(1000000)
normalized_data = normalize(data)
print(normalized_data[:10])  # 打印归一化结果的前10个元素

解释:

  • 在这个例子中,prange 用于对两个独立的循环并行化:一个用于求和,另一个用于归一化。
  • Numba 可以高效地并行化向量操作,提高处理大规模数组的效率。

5. GPU 加速

Numba 支持使用 CUDA 将计算任务卸载到 GPU 上执行。GPU 非常擅长处理大规模并行计算,尤其是在矩阵运算和深度学习等领域。

5.1 安装 CUDA 支持

要使用 Numba 的 GPU 功能,首先你需要安装 NVIDIA CUDA Toolkit,并确保有一个支持 CUDA 的 NVIDIA GPU。

5.2 使用 CUDA 加速

示例代码:简单的 GPU 向量加法

from numba import cuda
import numpy as np# 定义一个在 GPU 上运行的内核函数
@cuda.jit
def gpu_add(a, b, c):i = cuda.grid(1)  # 获取线程的唯一ID(索引)if i < c.size:  # 确保索引在数组范围内c[i] = a[i] + b[i]  # 执行数组加法# 初始化输入数据
n = 1000000
a = np.random.rand(n)
b = np.random.rand(n)
c = np.zeros(n)# 将数据复制到 GPU
a_device = cuda.to_device(a)
b_device = cuda.to_device(b)
c_device = cuda.to_device(c)# 设置 GPU 线程数和块数
threads_per_block = 512
blocks_per_grid = (a_device.size + (threads_per_block - 1)) // threads_per_block# 调用 GPU 上的加法函数
gpu_add[blocks_per_grid, threads_per_block](a_device, b_device, c_device)# 将结果从 GPU 复制回 CPU
c = c_device.copy_to_host()print(c[:10])  # 打印结果的前10个元素

解释:

  • @cuda.jit 定义了一个 CUDA 内核函数,在 GPU 上并行执行数组的元素加法。
  • cuda.grid(1) 获取当前线程的索引,以确定每个线程处理的数据块。
  • 数据通过 cuda.to_device 传输到 GPU,GPU 完成计算后,再通过 copy_to_host 将结果返回到 CPU。

总结

Numba 是一个强大的工具,它能够极大地加速 Python 代码,尤其是在数值计算和矩阵操作方面。通过 @jit@njit,可以轻松地将 Python 代码编译为高效的机器代码,同时可以利用并行化和 GPU 加速功能来进一步提升性能。

相关文章:

Numba基础

1. Numba 基础 1.1 什么是 Numba&#xff1f; Numba 是一个 JIT 编译器&#xff0c;用于加速数值计算。它通过即时编译技术&#xff0c;将 Python 代码在运行时编译为机器代码&#xff0c;极大地提升执行速度&#xff0c;特别适合循环和矩阵操作等密集型计算。 2. Numba 基本…...

[JAVA]介绍怎样在Java中通过字节字符流实现文件读取与写入

一&#xff0c;初识File类及其常用方法 File类是java.io包下代表与平台无关的文件和目录&#xff0c;程序中操作文件和目录&#xff0c;都可以通过File类来完成。 通过这个File对象&#xff0c;可以进行一系列与文件相关的操作&#xff0c;比如判断文件是否存在&#xff0c;获…...

oracle停止当前运行的JOB或kill会话

在Oracle中&#xff0c;可以使用DBA_SCHEDULER_JOBS视图来查找当前正在运行的作业&#xff08;job&#xff09;&#xff0c;并使用DBMS_SCHEDULER.STOP_JOB过程来停止它们 SELECT JOB_NAME, STATE FROM DBA_SCHEDULER_JOBS WHERE STATE RUNNING; SELECT * FROM DBA_SCHEDULE…...

SpringBoot 消息队列RabbitMQ 消息可靠性 数据持久化 与 LazyQueue

介绍 在默认情况下&#xff0c;RabbitMQ会将接收到的信息保存在内存中以降低消息收发的延迟 一旦MO宕机&#xff0c;内存中的消息会丢失内存空间有限&#xff0c;当消费者故障或处理过慢时&#xff0c;会导致消息积压&#xff0c;引发MQ阻塞 在消息队列运行的过程中&#xf…...

CLIP论文中关键信息记录

由于clip论文过长&#xff0c;一直无法完整的阅读该论文&#xff0c;故而抽取论文中的关键信息进行记录。主要记录clip是如何实现的的&#xff08;提出背景、训练数据、设计模式、训练超参数、prompt的作用&#xff09;&#xff0c;clip的能力&#xff08;clip的模型版本、clip…...

sshj使用代理连接服务器

之前我是用jsch连接服务器的&#xff0c;但是没办法使用私钥连接&#xff0c;搜了一下似乎是不支持新版的SSH-rsa&#xff0c;并且jsch很久没更新了&#xff0c;java - "com.jcraft.jsch.JSchException: Auth fail" with working passwords - Stack Overflow 没办法…...

【Leetcode:1184. 公交站间的距离 + 模拟】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…...

VRRP 笔记

一、概念&#xff1a; vrrp&#xff1a;Virtual Router Redundancy Protocol 虚拟路由冗余协议&#xff0c;当网关发生故障时&#xff0c;进行主备切换&#xff0c;保证业务连续性 把多台物理机的网关虚拟成一台Virtual Router&#xff0c;称为 VRID VIP&#xff1a;虚拟IP VM…...

【洛谷】P3743 小鸟的设备 的题解

【洛谷】P3743 小鸟的设备 的题解 题目传送门 题解 水一道二分 qaq 刚开始考虑的是动态规划&#xff0c;但是动态规划并不能维护题目所要求的东西。所以我们将思路转向另一种求最值问题的方法&#xff1a;二分答案。 首先&#xff0c;如果一个设备在 t t t 的时间内消耗的…...

算法面经手撕系列(2)--手撕BatchNormlization

BatchNormlization BatchNormlization的编码流程&#xff1a; init阶段初始化 C i n C_in Ci​n大小的scale向量和shift向量&#xff0c;同时初始化相同大小的滑动均值向量和滑动标准差向量&#xff1b;forward时沿着非channel维度计算均值、有偏方差依据得到均值和有偏方差进…...

mysql-搭建主从复制

文章目录 1、准备主服务器2、准备从服务器3、主库配置3.1、创建MySQL主服务器配置文件&#xff1a; 4、从库配置5、搭建主从&测试5.1、使用命令行登录MySQL主服务器5.2、主机中查询master状态&#xff1a;5.3、从机中查询slave状态&#xff1a;5.4、主机中创建slave用户&am…...

MiniMaxi-共创智能新体验新手入门

新手快速入门 注册指南 个人用户 直接注册即可。 企业团队 主账号&#xff1a;注册时填写的姓名与手机号将成为企业账号的管理员。子账号&#xff1a;在用户中心创建&#xff0c;数量不限。 主账号与子账号权益 相同权益&#xff1a;子账号享有与主账号相同的使用权益和速…...

Docker torchserve 部署模型流程

1.拉取官方镜像 地址: https://hub.docker.com/r/pytorch/torchserve/tags docker pull pytorch/torchserve:0.7.1-gpu2. docker启动指令 CPU docker run --rm -it -d -p 8380:8080 -p 8381:8081 --name torch-server -v /path/model-server/extra-files:/home/model-serve…...

mybatis开启日志

步骤很详细&#xff0c;直接上教程 配置文件的文件格式可能有所不同&#xff0c;这里列举两种 配置方法 一. application.properties&#xff08;默认 # 配置mybatis的日志信息 mybatis.configuration.log-implorg.apache.ibatis.logging.stdout.StdOutImpl二. application.y…...

MobaXterm : Network error: Connection refused(连接被拒绝)

具体报错如下如所示&#xff1a; 首先进行问题排查 ① 检查SSH服务是否运行 sudo service ssh status ② 检查SSH服务是否已启动&#xff08;启用返回 enable&#xff09; sudo systemctl is-enabled ssh ③ 查看所有的端口 sudo netstat -tulnp ④ 查看SSH使用的22号端口有…...

电脑的主板,内存条插多少合适?

首先&#xff0c;不是插满4条内存就是最好的。 内存条插得多&#xff0c;确实可以扩充容量&#xff0c;提升性能。但是有些低端的主板配低端CPU&#xff0c;插满4条内存&#xff0c;稳定性下降。这里的稳定性包括供电&#xff0c;单独的内存供电容量等。此时CPU会通过降低内存…...

C++:初始化列表

构造函数在上一篇帖子我们提到了对成员变量初始化的功能&#xff0c;出了在构造函数的函数体中队成员变量一个一个赋值以外&#xff0c;我们还可以采用初始化列表。 #include<iostream> using namespace std;class AA { private:int a;const int b; public:AA():b(200),…...

[000-01-008].第05节:OpenFeign特性-重试机制

我的后端学习大纲 SpringCloud学习大纲 1.1.重试机制的默认值&#xff1a; 1.重试机制默认是关闭的&#xff0c;给了默认值 1.2.测试重试机制的默认值&#xff1a; 1.3.开启Retryer功能&#xff1a; 1.修改配置文件YML的配置&#xff1a; 2.新增配置类&#xff1a; packa…...

Android 11(API 级别 30)及以上版本中,将Bitmap保存到设备上

调用 saveBitmapToMediaStore(getContentResolver(),bitmap,“图片名”,mimeType); 参数解析&#xff1a; Bitmap myBitmap ...; // 这里应该是你获取或创建Bitmap的代码 private String mimeType "image/jpeg"; // 或者"image/png"&#xff0c;取决于…...

django orm增删改查操作

1. 基本操作 1.1 创建对象 可以通过 Django ORM 来创建数据库中的记录。 示例&#xff1a; # 方法1&#xff1a;先创建对象&#xff0c;再保存 person Person(nameAlice, age30, emailaliceexample.com) person.save()# 方法2&#xff1a;直接创建 person Person.objects…...

如何从零构建智能FOC轮腿机器人:完整开源硬件系统终极指南

如何从零构建智能FOC轮腿机器人&#xff1a;完整开源硬件系统终极指南 【免费下载链接】foc-wheel-legged-robot Open source materials for a novel structured legged robot, including mechanical design, electronic design, algorithm simulation, and software developme…...

Transient、QuickEye、VerifyEye傻傻分不清?一文讲透Ansys里三种眼图仿真方法的适用场景与避坑指南

Transient、QuickEye、VerifyEye深度解析&#xff1a;Ansys眼图仿真技术选型实战指南 在高速数字系统设计中&#xff0c;眼图分析是评估信号完整性的黄金标准。面对Ansys工具链中三种截然不同的眼图生成方法&#xff0c;工程师常常陷入选择困境——是追求精确度的传统瞬态分析&…...

双系统Ubuntu磁盘告急?别重装!用GParted无损扩容保姆级教程(附U盘启动盘制作)

双系统Ubuntu磁盘告急&#xff1f;别重装&#xff01;用GParted无损扩容保姆级教程&#xff08;附U盘启动盘制作&#xff09;当你在Windows和Ubuntu双系统环境下工作时&#xff0c;是否遇到过这样的窘境&#xff1a;当初安装时给Ubuntu分配的空间捉襟见肘&#xff0c;而Windows…...

全球无障碍宣传日:iOS 26 辅助功能大升级,这些实用小功能你用过吗?

辅助功能发展与升级很多人对辅助功能的印象还停留在 "小白点"&#xff0c;但随着 iPhone 进入全面屏时代&#xff0c;它逐渐变得陌生。实际上&#xff0c;Apple 每年都会为其增添功能&#xff0c;方便身体有障人士使用 iPhone。而且&#xff0c;这些功能不仅惠及有障…...

别再手动测模型了!用Simulink Test Manager实现自动化测试(附Excel表格配置详解)

从手动测试到智能验证&#xff1a;Simulink Test Manager全流程自动化实战指南 在模型开发的迭代过程中&#xff0c;工程师们常常陷入"修改-测试-记录"的循环泥潭。每次参数调整后&#xff0c;手动运行模型、记录数据、比对结果不仅消耗大量时间&#xff0c;更可能因…...

别再只用鼠标了!用Leap Motion手势控制Unity游戏,保姆级配置避坑指南(2024版)

2024年Unity手势交互开发实战&#xff1a;Leap Motion从配置到游戏逻辑全解析在游戏开发领域&#xff0c;交互方式的创新往往能带来全新的体验。想象一下&#xff0c;玩家不再需要键盘鼠标&#xff0c;仅凭自然的手部动作就能操控游戏角色——这正是Leap Motion手势识别技术为U…...

微信聊天图片丢了别慌!保姆级教程:找回并解密DAT文件(支持新旧版微信路径)

微信DAT图片恢复实战&#xff1a;从文件定位到批量解密的完整指南 微信聊天记录中的图片突然消失&#xff1f;别急着放弃&#xff01;那些看似无法打开的DAT文件里&#xff0c;可能藏着您的重要回忆或工作资料。本文将带您深入微信存储机制&#xff0c;手把手完成从文件定位到…...

独家首发|DeepSeek官方未公开的IP检查API接口文档(含沙箱环境调用密钥获取路径)

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;DeepSeek知识产权检查 DeepSeek系列大模型&#xff08;如DeepSeek-V2、DeepSeek-Coder、DeepSeek-MoE&#xff09;由深度求索&#xff08;DeepSeek&#xff09;公司自主研发&#xff0c;其权重、训练代码、推…...

Unity Cinemachine相机系统深度使用:除了自动跟随,它的边界限制(Confiner)功能才是宝藏

Unity Cinemachine Confiner&#xff1a;解锁专业级镜头边界控制的实战指南在游戏开发中&#xff0c;镜头控制往往是被低估的艺术。许多开发者对Cinemachine的印象停留在"智能跟随相机"层面&#xff0c;却不知道它的Confiner功能能够彻底改变游戏镜头的专业度。想象一…...

WaveTools鸣潮工具箱:3步完成游戏性能优化与配置调校的完整指南

WaveTools鸣潮工具箱&#xff1a;3步完成游戏性能优化与配置调校的完整指南 【免费下载链接】WaveTools &#x1f9f0;鸣潮工具箱 项目地址: https://gitcode.com/gh_mirrors/wa/WaveTools WaveTools鸣潮工具箱是一款专为《鸣潮》玩家设计的开源性能优化工具&#xff0c…...