Numba 从零基础到实战:解锁 Python 性能新境界

Numba 从零基础到实战:解锁 Python 性能新境界

一、引言

在 Python 的世界里,性能一直是一个备受关注的话题。Python 以其简洁易读的语法和丰富的库生态,深受开发者喜爱,但在处理一些计算密集型任务时,其执行速度往往差强人意。这时,Numba 就像是一把利剑,能够显著提升 Python 代码的性能。本文将带你从零基础开始,逐步深入了解 Numba,最终实现实战应用。

二、Numba 是什么

Numba 是一个开源的即时编译器(JIT),由 NVIDIA 开发。它能够将 Python 函数动态编译为高效的机器码,尤其是在处理数值计算和 NumPy 数组时,性能提升显著。Numba 无需你编写复杂的 C 或 C++ 代码,只需在 Python 函数上添加一个装饰器,就能让代码运行得更快。

三、环境搭建

安装 Numba

使用 pip 安装 Numba 非常简单,只需在命令行中运行以下命令:

pip install numba

如果你想使用 GPU 加速功能,还需要安装 CUDA 工具包(适用于 NVIDIA GPU),并使用以下命令安装相关依赖:

pip install numba cuda-python

验证安装

安装完成后,我们可以编写一个简单的 Python 脚本来验证 Numba 是否安装成功:

import numba@numba.jit
def add_numbers(a, b):return a + bresult = add_numbers(3, 5)
print(result)

如果代码能够正常运行并输出结果,说明 Numba 已经安装成功。

四、Numba 基础语法

装饰器 @jit@njit

  • @jit:这是 Numba 中最常用的装饰器,它可以将函数编译为机器码。@jit 会根据函数的内容自动选择编译模式,如果函数中只包含 Numba 支持的类型和操作,它会使用 nopython 模式,否则使用 object 模式。
import numba@numba.jit
def square_sum(arr):result = 0for i in range(len(arr)):result += arr[i] ** 2return resultimport numpy as np
arr = np.array([1, 2, 3, 4, 5])
print(square_sum(arr))
  • @njit:等同于 @jit(nopython=True),它强制使用 nopython 模式。在 nopython 模式下,函数不能使用 Python 的动态特性,只能使用 Numba 支持的类型和操作,但编译后的代码性能更高。
import numba@numba.njit
def multiply_numbers(a, b):return a * bprint(multiply_numbers(4, 6))

类型签名

在使用 @jit@njit 时,可以指定函数的类型签名,这样可以提高编译效率。

import numba@numba.jit('float64(float64, float64)')
def divide_numbers(a, b):return a / bprint(divide_numbers(8.0, 2.0))

五、CPU 加速实战

案例:计算数组的均值

我们先来看一个简单的计算数组均值的例子,对比使用 Numba 前后的性能差异。

普通 Python 实现
import numpy as npdef mean_python(arr):total = 0for i in range(len(arr)):total += arr[i]return total / len(arr)arr = np.random.rand(1000000)
import time
start = time.time()
result = mean_python(arr)
end = time.time()
print(f"普通 Python 实现耗时: {end - start} 秒")
Numba 加速实现
import numba
import numpy as np@numba.njit
def mean_numba(arr):total = 0for i in range(len(arr)):total += arr[i]return total / len(arr)arr = np.random.rand(1000000)
import time
start = time.time()
result = mean_numba(arr)
end = time.time()
print(f"Numba 加速实现耗时: {end - start} 秒")

通过对比可以发现,使用 Numba 加速后的代码运行速度明显更快。

并行计算

Numba 支持在 CPU 上进行并行计算,通过 parallel=Trueprange 来实现。

import numba
import numpy as np@numba.njit(parallel=True)
def parallel_sum(arr):result = 0for i in numba.prange(len(arr)):result += arr[i]return resultarr = np.random.rand(1000000)
import time
start = time.time()
result = parallel_sum(arr)
end = time.time()
print(f"并行计算耗时: {end - start} 秒")

六、GPU 加速实战

案例:矩阵加法

如果你的计算机配备了 NVIDIA GPU,就可以使用 Numba 进行 GPU 加速。下面是一个矩阵加法的例子。

import numba.cuda
import numpy as np@numba.cuda.jit
def matrix_addition_kernel(A, B, C):x, y = numba.cuda.grid(2)if x < C.shape[0] and y < C.shape[1]:C[x, y] = A[x, y] + B[x, y]def matrix_addition(A, B):C = np.zeros_like(A)d_A = numba.cuda.to_device(A)d_B = numba.cuda.to_device(B)d_C = numba.cuda.to_device(C)threads_per_block = (16, 16)blocks_per_grid_x = (A.shape[0] + threads_per_block[0] - 1) // threads_per_block[0]blocks_per_grid_y = (A.shape[1] + threads_per_block[1] - 1) // threads_per_block[1]blocks_per_grid = (blocks_per_grid_x, blocks_per_grid_y)matrix_addition_kernel[blocks_per_grid, threads_per_block](d_A, d_B, d_C)C = d_C.copy_to_host()return CA = np.random.rand(1000, 1000)
B = np.random.rand(1000, 1000)
result = matrix_addition(A, B)
print(result)

七、常见问题与注意事项

1. nopython 模式限制

在 nopython 模式下,函数不能使用 Python 的一些动态特性,如动态数据结构(列表、字典)的复杂操作。如果遇到这种情况,需要将代码进行重构,或者使用 object 模式。

2. 数据传输开销

在使用 GPU 加速时,数据在 CPU 和 GPU 之间的传输会产生一定的开销。因此,尽量减少数据传输的次数,将多次小规模的数据传输合并为一次大规模的数据传输。

3. 性能调优

要根据具体的任务和数据特点,选择合适的编译模式、并行策略和线程块大小,以达到最佳的性能。

八、总结

Numba 为 Python 开发者提供了一种简单而有效的方式来提升代码性能。通过本文的学习,你已经从零基础开始,了解了 Numba 的基本概念、语法和使用方法,并通过实战案例掌握了 CPU 和 GPU 加速的技巧。在实际应用中,不断尝试和优化,你将能够充分发挥 Numba 的威力,让你的 Python 代码运行得更快。

希望这篇博客能够帮助你快速上手 Numba,并在实际项目中取得良好的效果!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/75937.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

单位门户网站被攻击后的安全防护策略

政府网站安全现状与挑战 近年来&#xff0c;随着数字化进程的加速&#xff0c;政府门户网站已成为政务公开和服务公众的重要窗口。然而&#xff0c;网络安全形势却日益严峻。国家互联网应急中心的数据显示&#xff0c;政府网站已成为黑客攻击的重点目标&#xff0c;被篡改和被…

Spring Boot 项目三种打印日志的方法详解。Logger,log,logger 解读。

目录 一. 打印日志的常见三种方法&#xff1f; 1.1 手动创建 Logger 对象&#xff08;基于SLF4J API&#xff09; 1.2 使用 Lombok 插件的 Slf4j 注解 1.3 使用 Spring 的 Log 接口&#xff08;使用频率较低&#xff09; 二. 常见的 Logger&#xff0c;logger&#xff0c;…

NI的LABVIEW工具安装及卸载步骤说明

一.介绍 最近接到个转交的项目&#xff0c;项目主要作为上位机工具开发&#xff0c;在对接下位机时&#xff0c;有用到NI的labview工具。labview软件是由美国国家仪器&#xff08;NI&#xff09;公司研制开发的一种程序开发环境&#xff0c;主要用于汽车测试、数据采集、芯片测…

cmd 终端输出乱码问题 |Visual Studio 控制台输出中文乱码解决

在网上下载&#xff0c;或者移植别人的代码到自己的电脑&#xff0c;使用VS运行后&#xff0c;控制台输出中文可能出现乱码。这是因为源代码的编码格式和控制台的编码格式不一致。 文章目录 查看源代码文件编码格式查看输出控制台编码格式修改编码格式修改终端代码页 补充总结 …

A009-基于pytest的网易云自动化测试

题 目 :基于pytest的网易云自动化测试 主要内容 综合应用所学的软件测试理论和方法,实现网易云的功能自动化测试。 (1)自动化测试介绍; (2)自动化功能测试框架介绍; (3)设计功能测试用例 (4)书写自动化测试脚本; (5)测试评价与结论。 任务要求 (1)能…

LVGL Video控件和Radiobtn控件详解

LVGL Video控件和Radiobtn控件详解 一、 Video控件详解1. 概述2. 创建和初始化3. 基本属性设置4. 视频控制5. 回调函数6. 高级功能7. 注意事项 二、Radiobtn控件详解1. 概述2. 创建和初始化3. 属性设置4. 状态控制5. 组管理6. 事件处理7. 样式设置8. 注意事项 三、效果展示四、…

AbortController:让异步操作随时说停就停

AbortController&#xff1a;让异步操作随时说停就停 一、什么是 AbortController&#xff1f; AbortController 是 JavaScript 在浏览器和部分 Node.js 环境中提供的全局类&#xff0c;用来中止正在进行或待完成的异步操作&#xff08;如 fetch() 请求、事件监听、可写流、数…

机器学习 从入门到精通 day_04

1. 决策树-分类 1.1 概念 1. 决策节点 通过条件判断而进行分支选择的节点。如&#xff1a;将某个样本中的属性值(特征值)与决策节点上的值进行比较&#xff0c;从而判断它的流向。 2. 叶子节点 没有子节点的节点&#xff0c;表示最终的决策结果。 3. 决策树的…

C++ Primer (第五版)-第十三章 拷贝控制

文章目录 概述13.1拷贝、赋值与销毁合成拷贝构造函数拷贝初始化参数和返回值拷贝初始化的限制编译器可以绕过拷贝构造函数拷贝运算符析构函数三/五原则使用default阻止拷贝合成的拷贝控制成员可能是删除的 private拷贝控制拷贝控制和资源管理行为像值的类类值拷贝赋值运算符定义…

Vue el-from的el-form-item v-for循环表单如何校验rules(一)

实际业务需求场景&#xff1a; 新增或编辑页面&#xff08;基础信息表单&#xff0c;一个数据列表的表单&#xff09;&#xff0c;数据列表里面的表单数是动态添加的。数据可新增、可删除&#xff0c;在表单保存前&#xff0c;常常需要做表单必填项的校验&#xff0c;校验通过以…

测试100问:http和https的区别是什么?

哈喽&#xff0c;大家好&#xff0c;我是十二&#xff0c;今天给大家分享的问题是&#xff1a;http和https的区别是什么&#xff1f; 首先我们要知道 HTTP 协议传播的数据都是未加密的&#xff0c;也就是明文的&#xff0c;因此呢使用 http协议传输一些隐私信息也就非常不安全&…

YOLOv3超详细解读(三):源码解析:数据处理模块

一、概述 YOLOv3&#xff08;You Only Look Once v3&#xff09;是一种高效的目标检测算法&#xff0c;其数据处理模块是训练和推理流程的核心部分。本文将深入分析Ultralytics团队基于PyTorch实现的YOLOv3源码中的数据处理模块&#xff0c;重点探讨数据加载、预处理和数据增强…

每日算法(双指针算法)(Day 1)

双指针算法 1.算法题目&#xff08;移动零&#xff09;2.讲解算法原理3.编写代码 1.算法题目&#xff08;移动零&#xff09; 2.讲解算法原理 数组划分&#xff0c;数组分块&#xff08;快排里面最核心的一步&#xff09;只需把0改为tmp 双指针算法&#xff1a;利用数组下标来…

2025蓝桥杯python A组省赛 题解

真捐款去了&#xff0c;好长时间没练了&#xff0c;感觉脑子和手都不转悠了。 B F BF BF 赛时都写假了&#xff0c; G G G 也只写了爆搜。 题解其实队友都写好了&#xff0c;我就粘一下自己的代码&#xff0c;稍微提点个人的理解水一篇题解 队友题解 2025蓝桥杯C A组省赛 题…

测试基础笔记第四天(html)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 html介绍1. 介绍2.骨架标签3.常用标签标题标签段落标签超链接标签图片标签换行和空格标签布局标签input标签&#xff08;变形金刚&#xff09;form标签列表标签 htm…

10 穴 汽车连接器的15个设计特点

汽车行业严重依赖卓越的电气系统来确保功能和可靠性。这些系统的关键组件是 10 腔连接器&#xff0c;它为布线和信号传输提供解决方案。制造商和工程师必须仔细评估这些连接器的设计特性&#xff0c;以优化性能和安全性。 本博客研究了汽车 10 腔连接器的 15 个设计特征&#…

Summary

一、数据结构 1.1 哈希 主要是HashMap和HashSet&#xff1b;其中HashSet底层是一个HashMap属性。 // 获取HashMap元素,HashSet均不支持 map.keySet (); // Set<k> map.values (; // Collection<V> map.entrySet();//Set<Map.Entry<K,V>> for (Map.E…

【Leetcode-Hot100】最小覆盖子串

题目 解答 想到使用双指针哈希表来实现&#xff0c;双指针的left和right控制实现可满足字符串。 class Solution(object):def minWindow(self, s, t):""":type s: str:type t: str:rtype: str"""len_s, len_t len(s), len(t)hash_map {}for…

Flutter 播放利器:`media_kit` 的详细介绍与使用指南

在 Flutter 项目中实现音视频播放&#xff0c;开发者过去主要依赖如 video_player、just_audio 等第三方库&#xff0c;但这些库或多或少存在一些局限性&#xff0c;比如平台兼容性差、定制能力不足、播放格式有限等问题。 而 media_kit 是近年崛起的一款全平台音视频播放解决…

4.14【Q】pc homework3

我正在学习并行计算&#xff0c;解决这个问题&#xff1f;详细解释&#xff0c;越细节越好 我正在学习并行计算&#xff0c;“首次允许在 taskloop 构造中使用 reduction 子句&#xff0c;并引入了 task_reduction&#xff08;用于 taskgroup 构造&#xff09;和 in_reduction&…