Python使用Numba装饰器进行加速

Python使用Numba装饰器进行加速

  • 前言
  • 前提条件
  • 相关介绍
  • 实验环境
  • Numba装饰器进行加速
    • 未加速的代码
      • 输出结果
    • @numba.jit加速的代码
      • 输出结果

在这里插入图片描述

前言

  • 由于本人水平有限,难免出现错漏,敬请批评改正。
  • 更多精彩内容,可点击进入Python日常小操作专栏、OpenCV-Python小应用专栏、YOLO系列专栏、自然语言处理专栏或我的个人主页查看
  • 基于DETR的人脸伪装检测
  • YOLOv7训练自己的数据集(口罩检测)
  • YOLOv8训练自己的数据集(足球检测)
  • YOLOv5:TensorRT加速YOLOv5模型推理
  • YOLOv5:IoU、GIoU、DIoU、CIoU、EIoU
  • 玩转Jetson Nano(五):TensorRT加速YOLOv5目标检测
  • YOLOv5:添加SE、CBAM、CoordAtt、ECA注意力机制
  • YOLOv5:yolov5s.yaml配置文件解读、增加小目标检测层
  • Python将COCO格式实例分割数据集转换为YOLO格式实例分割数据集
  • YOLOv5:使用7.0版本训练自己的实例分割模型(车辆、行人、路标、车道线等实例分割)
  • 使用Kaggle GPU资源免费体验Stable Diffusion开源项目

前提条件

  • 熟悉Python

相关介绍

  • Python是一种跨平台的计算机程序设计语言。是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的、大型项目的开发。
  • Python是一种非常流行和强大的编程语言,它有很多优点,比如简洁、易读、灵活、跨平台、丰富的库等。但是,Python也有一些缺点,其中之一就是运行速度相对较慢。
  • Python为什么慢呢?这主要有以下几个原因:
    • Python是一种解释型语言,也就是说,它的代码在运行时才被解释器转换成机器语言,而不是像编译型语言那样,提前编译成可执行文件。这样就增加了运行时的开销,降低了执行效率。
    • Python使用了动态类型,也就是说,它的变量在运行时才确定类型,而不是像静态类型那样,提前声明类型。这样就增加了运行时的类型检查和转换,降低了执行效率。
    • Python使用了全局解释器锁(GIL),也就是说,它的多线程在同一时刻只能有一个线程执行,而不是像多核处理器那样,可以并行执行多个线程。这样就限制了Python的并发能力,降低了执行效率。
  • Python的运行速度可以通过一些方法进行优化和加速,比如:
    • 使用PyPy,这是一种基于JIT(即时编译)技术的Python解释器,它可以在运行时动态编译Python代码,提高执行效率。
    • 使用Numba,这是一种基于LLVM(低级虚拟机)技术的Python库,它可以将Python函数编译成机器码,提高执行效率。
    • 使用Cython,这是一种基于C语言的Python扩展,它可以将Python代码转换成C代码,提高执行效率。
    • 使用多进程,这是一种利用多核处理器的并行计算方法,它可以创建多个进程,避免GIL的限制,提高执行效率。
  • Numba是一个用于Python的开源即时编译器,它可以将Python代码编译为机器代码,从而提高Python代码的执行速度。
  • Numba的优缺点:
    • 优点:
      • Numba可以显著提高Python代码的执行速度,特别是在处理大量数据时。
      • Numba使用LLVM(低级虚拟机)技术将Python函数编译成机器码,从而避免了Python解释器的性能瓶颈。
      • Numba可以通过使用JIT(Just-In-Time)编译技术,将Python代码转换为机器代码,即当你调用Python函数时,你的全部或部分代码就会被转换为“即时”执行的机器码,它将以你的本地机器码速度运行,从而避免了Python解释器的性能瓶颈。
      • Numba支持多种CPU架构和操作系统,包括x86、ARM和PowerPC。
      • Numba可以与NumPy和SciPy等科学计算库无缝集成。
    • 缺点:
      • Numba只能加速一部分Python代码,例如数值计算密集型代码,而对于I/O密集型代码,Numba的加速效果不明显。
      • Numba需要对代码进行修改,以便使用其加速功能,这可能需要一些额外的工作。
      • Numba的性能取决于代码的质量和结构,因此需要一定的编程经验和技能。
  • 以下是一个简单的numba加速例子,它比较了使用numba和不使用numba的情况下,计算斐波那契数列的第n项的时间消耗。
import time
import numbaimport warnings
warnings.filterwarnings('ignore')# 不使用numba的函数
def fib(n):if n < 2:return nreturn fib(n-1) + fib(n-2)# 使用numba的函数
@numba.jit
def fib_numba(n):if n < 2:return nreturn fib_numba(n-1) + fib_numba(n-2)# 测试两个函数的运行时间
n = 40
start = time.time()
fib(n)
end = time.time()
print(f'不使用numba的时间:{end - start}秒')start = time.time()
fib_numba(n)
end = time.time()
print(f'使用numba的时间:{end - start}秒')
不使用numba的时间:15.397910833358765秒
使用numba的时间:0.731497049331665秒

实验环境

  • Python 3.x (面向对象的高级语言)
  • Numba 0.58.1(Python第三方库)pip install numba -i https://pypi.tuna.tsinghua.edu.cn/simple
    在这里插入图片描述

Numba装饰器进行加速

未加速的代码

import timedef one_cycle():num = 0  for i in range(1, 1000000):  num +=ireturn numdef double_cycle():num = 0 for i in range(1000):  for j in range(1000):num +=i*jreturn num  def triple_cycle():num = 0for i in range(100):  for j in range(100):  for k in range(100):num += i*j*kreturn num        if __name__=="__main__":start_time = time.time()for i in range(100):one_cycle()end_time = time.time()print("one_cycle函数运行时间:",(end_time-start_time)/100)start_time = time.time()for i in range(100):double_cycle()end_time = time.time()print("double_cycle函数运行时间:",(end_time-start_time)/100)start_time = time.time()for i in range(100):triple_cycle()end_time = time.time()print("triple_cycle函数运行时间:",(end_time-start_time)/100)

输出结果

one_cycle函数运行时间: 0.021781625747680663
double_cycle函数运行时间: 0.031956143379211426
triple_cycle函数运行时间: 0.042625854015350344

@numba.jit加速的代码

import time
import numbaimport warnings
warnings.filterwarnings('ignore')@numba.jit
def one_cycle():num = 0  for i in range(1, 1000000):  num +=ireturn num@numba.jit
def double_cycle():num = 0 for i in range(1000):  for j in range(1000):num +=i*jreturn num  @numba.jit
def triple_cycle():num = 0for i in range(100):  for j in range(100):  for k in range(100):num += i*j*kreturn num        if __name__=="__main__":start_time = time.time()for i in range(100):one_cycle()end_time = time.time()print("one_cycle函数运行时间:",(end_time-start_time)/100)start_time = time.time()for i in range(100):double_cycle()end_time = time.time()print("double_cycle函数运行时间:",(end_time-start_time)/100)start_time = time.time()for i in range(100):triple_cycle()end_time = time.time()print("triple_cycle函数运行时间:",(end_time-start_time)/100)

输出结果

one_cycle函数运行时间: 0.002056455612182617
double_cycle函数运行时间: 0.00046929597854614255
triple_cycle函数运行时间: 0.0007887816429138183
  • 由于本人水平有限,难免出现错漏,敬请批评改正。
  • 更多精彩内容,可点击进入Python日常小操作专栏、OpenCV-Python小应用专栏、YOLO系列专栏、自然语言处理专栏或我的个人主页查看
  • 基于DETR的人脸伪装检测
  • YOLOv7训练自己的数据集(口罩检测)
  • YOLOv8训练自己的数据集(足球检测)
  • YOLOv5:TensorRT加速YOLOv5模型推理
  • YOLOv5:IoU、GIoU、DIoU、CIoU、EIoU
  • 玩转Jetson Nano(五):TensorRT加速YOLOv5目标检测
  • YOLOv5:添加SE、CBAM、CoordAtt、ECA注意力机制
  • YOLOv5:yolov5s.yaml配置文件解读、增加小目标检测层
  • Python将COCO格式实例分割数据集转换为YOLO格式实例分割数据集
  • YOLOv5:使用7.0版本训练自己的实例分割模型(车辆、行人、路标、车道线等实例分割)
  • 使用Kaggle GPU资源免费体验Stable Diffusion开源项目

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

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

相关文章

已解决:Rust Error: the trait bound is not satisfied 问题

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页: &#x1f405;&#x1f43e;猫头虎的博客&#x1f390;《面试题大全专栏》 &#x1f995; 文章图文并茂&#x1f996…

python的format函数的用法及实例

目录 1.format函数的语法及用法 &#xff08;1&#xff09;语法&#xff1a;{}.format() &#xff08;2&#xff09;用法&#xff1a;用于格式化字符串。可以接受无限个参数&#xff0c;可以指定顺序。返回结果为字符串。 2.实例 &#xff08;1&#xff09;不设置位置&…

煤矿企业如何选择合适的设备健康管理系统

在煤矿开采的过程中&#xff0c;机电设备发挥着重要的作用。但大量的机电设备的使用也给煤矿企业设备管理提出了一定的要求。随着工业领域数字化的深入应用&#xff0c;煤矿机电设备的自动化、智能化管理已经成为煤矿企业发展的重要手段。保障机电设备的正常运行&#xff0c;减…

Spring Boot框架配置WebSocket【一遍过,不过你评论骂我】

【找了无数的文档资料总结】 【不停的找文档试】 【每一次都显示连接不上】 【终于成了……】 当使用Spring Boot框架配置WebSocket时, 通常会使用@ServerEndpoint注解来标识WebSocket端点, 并通过ServerEndpointExporter来注册这些端点。以下是配置WebSocket的步骤: 步骤…

2023.11.10联测总结

T 1 T1 T1求的是有多少个区间的异或和是 k k k的因子&#xff0c; n , k ≤ 1 0 5 n,k \leq 10^5 n,k≤105。 这道题用前缀和维护一下&#xff0c;暴力枚举所有区间就有 80 80 80分。 有一瞬间想过枚举因数&#xff0c;但是脑抽以为要 O ( n ) \mathcal O(n) O(n)枚举&#x…

传输层中的TCP和UPD协议

一)应用层协议简介:根据需求明确要传输的信息&#xff0c;明确要传输的数据格式&#xff1b; 应用层协议:这个协议&#xff0c;实际上是和程序员打交道最多的协议了 1)其它四层都是操作系统&#xff0c;驱动&#xff0c;硬件实现好了的&#xff0c;咱们是不需要管 2)应用层:当我…

红海云签约和兆服饰,科技引领服饰行业人力资源数字化转型

和兆服饰从事多品牌多品类经营管理&#xff0c;旗下拥有POLOSPORT、POLOKIDS、CARTELO等国际品牌。作为一个主打POLO文化的服饰品牌&#xff0c;诞生于美国的POLOSPORT拥有现代感的产品设计、系列化的产品搭配、全方位的服务&#xff0c;是最具美国马球精神的休闲时尚服饰品牌之…

基于JavaWeb+SSM+Vue微信小程序校园兼职任务平台系统的设计和实现

基于JavaWebSSMVue微信小程序校园兼职任务平台系统的设计和实现 源码传送入口前言主要技术系统设计功能截图Lun文目录订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 源码传送入口 前言 随着社会的发展和全球疫情的冲击&#xff0c;大学生的就业形势越来越严峻。越…

WordPress Modown 6.2付费下载资源/付费查看内容 wp主题模板+erphpdown11.7

模板简介&#xff1a; 自适应响应式设计&#xff0c;兼容主流浏览器 网格样式与瀑布流样式任意切换 内置SEO优化 自带与主题UI完美兼容搭配的erphpdown前端用户中心页面&#xff08;此功能若单独找我们定制也需要几百&#xff09; 收费付费下载资源、付费查看内容、付费观看…

LeetCode(1)合并两个有序数组【数组/字符串】【简单】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 88. 合并两个有序数组 1.题目 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中&#xff0c;使合…

探索经典算法:贪心、分治、动态规划等

1.贪心算法 贪心算法是一种常见的算法范式&#xff0c;通常在解决最优化问题中使用。 贪心算法是一种在每一步选择中都采取当前状态下最优决策的算法范式。其核心思想是选择每一步的最佳解决方案&#xff0c;以期望达到最终的全局最优解。这种算法特点在于只考虑局部最优解&am…

【学术综述】-如何写出一篇好综述-写好综述要注意的问题

文章目录 1.前置1.1 SSD 的结构1.2 FTL的架构和作用 2 动机-why&#xff1f;3 做了什么【做了哪些方面的survey】&#xff1f;4 背景知识【上下文】5 研究的问题6 每个问题对应的解决方案 从昨天晚上【2023.11.09 22:00】到今天22:29的&#xff0c;花了一天的时间在读这篇surve…

一文学会Scala【Scala一站式学习笔记】

文章目录 为什么要学习Scala语言什么是Scala如何快速掌握Scala语言Scala环境安装配置Scala命令行 Scala的基本使用变量数据类型操作符if 表达式语句终结符循环高级for循环 Scala的集合体系集合SetListMapArrayArrayBuffer数组常见操作Tuple总结 Scala中函数的使用函数的定义函数…

手握“发展密钥”,TCL科技或迎价值重估?

在高度竞争且快速变化的泛半导体产业&#xff0c;每一次周期性或结构性的变化&#xff0c;都会对企业经营策略带来深远的影响。 2023年前三季度&#xff0c;泛半导体产业迎来结构性复苏。其中&#xff0c;主流显示领域供需关系趋向健康化&#xff0c;半导体显示行业整体上量价…

【Node.js入门】1.1Node.js 简介

Node.js入门之—1.1Node.js 简介 文章目录 Node.js入门之—1.1Node.js 简介什么是 Node.js错误说法 Node.js 的特点跨平台三方类库自带http服务器非阻塞I/O事件驱动单线程 Node.js 的应用场合适合用Node.js的场合不适合用Node.js的场合弥补Node.js不足的解决方案 什么是 Node.j…

获取AAC音频的ADTS固定头部信息

文章目录 前言一、AAC音频中的ADTS二、解析ADTS信息1.标准文档中介绍2.解析3.采样率索引和值4.下载AAC标准文档 前言 调试嵌入式设备中播放aac音频的过程中&#xff0c;了解了aac音频格式&#xff0c;记录在此&#xff0c;防止遗忘。 一、AAC音频中的ADTS ADTS&#xff08;Audi…

2.【自动驾驶与机器人中的SLAM技术】左乘模型推导ESKF

目录 1. 证明题 证明&#xff1a;若某个高斯随机变量为零均值&#xff0c;协方差为对角线矩阵且大小相同&#xff08;各向同性&#xff09;&#xff0c;那么在乘任意旋转矩阵以后&#xff0c;其均值仍为零&#xff0c;且协方差不变&#xff1b; 2. 代码实现运动方程将F矩阵…

Webpack--动态 import 原理及源码分析

前言 在平时的开发中&#xff0c;我们经常使用 import()实现代码分割和懒加载。在低版本的浏览器中并不支持动态 import()&#xff0c;那 webpack 是如何实现 import() polyfill 的&#xff1f; 原理分析 我们先来看看下面的 demo function component() {const btn docume…

【ARM Coresight OpenOCD 系列 1 -- OpenOCD 介绍】

请阅读【ARM Coresight SoC-400/SoC-600 专栏导读】 文章目录 1.1 OpenOCD 介绍1.1.1 OpenOCD 支持的JTAG 适配器1.1.2 OpenOCD 支持的调试设备1.1.3 OpenOCD 支持的 Flash 驱动 1.2 OpenOCD 安装与使用1.2.1 OpenOCD 代码获取及安装1.2.2 OpenOCD 使用1.2.3 OpenOCD 启用 GDB…

Ubuntu 22.04 安装水星无线 USB 网卡

我的 USB 网卡是水星 Mercury 的&#xff0c; 在 Ubuntu 22.04 下面没有自动识别。 没有无线网卡的时候只能用有线接到路由器上&#xff0c;非常不方便。 寻思着把无线网卡驱动装好。折腾了几个小时装好了驱动。 1.检查网卡类型 & 安装驱动 使用 lsusb 看到的不一定是准确…