Python中Numba库装饰器

一、运行速度是Python天生的短板

在这里插入图片描述

1.1 编译型语言:C++

对于编译型语言,开发完成以后需要将所有的源代码都转换成可执行程序,比如 Windows 下的.exe文件,可执行程序里面包含的就是机器码。只要我们拥有可执行程序,就可以随时运行,不用再重新编译了,也就是“一次编译,无限次运行”。
在运行的时候,我们只需要编译生成的可执行程序,不再需要源代码和编译器了,所以说编译型语言可以脱离开发环境运行。
编译型语言一般是不能跨平台的,也就是不能在不同的操作系统之间随意切换。

1.2 解释型语言:Python

对于解释型语言,每次执行程序都需要一边转换一边执行,用到哪些源代码就将哪些源代码转换成机器码,用不到的不进行任何处理。每次执行程序时可能使用不同的功能,这个时候需要转换的源代码也不一样。
因为每次执行程序都需要重新转换源代码,所以解释型语言的执行效率天生就低于编译型语言,甚至存在数量级的差距。计算机的一些底层功能,或者关键算法,一般都使用 C/C++ 实现,只有在应用层面(比如网站开发、批处理、小工具等)才会使用解释型语言。
在运行解释型语言的时候,我们始终都需要源代码和解释器,所以说它无法脱离开发环境。

1.3 速度对比:C++比Python快25倍

我不会C++语言、也没有C++语言的运行的环境,借用网友的对比结果:
在这里插入图片描述

编译后,运行C++代码,生成全部13-mers共6700万个大约需要2.42秒。这意味着运行相同算法,Python用时是C++的25倍多。

二、Numba使用与否的对比,计算1000万以内的素数

2.1 原生Python,计算1000万以内的素数
def U27_1000W以内的素数():import mathimport timedef is_prime(num):if num == 2:return Trueif num <= 1 or num % 2 == 0:return Falsefor div in range(3, int(math.sqrt(num) + 1), 2):if num % div == 0:return Falsereturn Truedef run_program(N):total = 0for i in range(N):if is_prime(i):total += 1return total# if __name__ == "__main__":N = 10000000start = time.time()total = run_program(N)end = time.time()print(f"1000万以内所有的素数有 {total} 个")print(f"纯Python耗时: {end - start} 秒\b")return end - start
2.2 Numba装饰器,计算1000万以内的素数
def U28_1000W以内的素数_Numba装饰器():import mathimport timefrom numba import njit, prange# @njit 相当于 @jit(nopython=True) @njitdef is_prime(num):if num == 2:        # 2为素数return Trueif num <= 1 or num % 2 == 0:     # 偶数中除了2都不是素数return Falsefor div in range(3, int(math.sqrt(num) + 1), 2):if num % div == 0:return Falsereturn True#使用Numba的prange来进行并发循环计算@njit(parallel = True)def run_program(N):total = 0#使用Numba提供的prange参数来进行并行计算for i in prange(N):if is_prime(i):total += 1return total# if __name__ == "__main__":N = 10000000start = time.time()total = run_program(N)end = time.time()print(f"1000万以内所有的素数有 {total} 个")print(f"Numba装饰器耗时: {end - start} 秒\b")return end - start
2.3 实测速度:使用numba装饰器,速度提升 22.0 倍,逼近C++
t0 = U27_1000W以内的素数()
t1 = U28_1000W以内的素数_Numba装饰器()
print(f'使用numba装饰器,速度提升 {round(t0/t1, 0)} 倍')1000万以内所有的素数有 664579 个
纯Python耗时: 86.781108856201171000万以内所有的素数有 664579 个
Numba装饰器耗时: 3.9410934448242188 秒
使用numba装饰器,速度提升 22.0

三、素数算法

质数也就是大于1的整数中,除了1和它本身以外不能被其他整数整除的数,也叫素数。

# 算法一:针对输入的数字x,我们可以遍历从2到x-1这个区间中的数,如果x能被这个区间中任意一个数整除,那么它就不是质数。
def is_prime1(x):for i in range(2, x):if x % i == 0:return Falsereturn True# 算法二:对算法一的优化,事实上只需要遍历从2到√x即可。
def is_prime2(x):for i in range(2, int(x ** 0.5) + 1):if x % i == 0:return Falsereturn True# 算法三:偶数中除了2都不是质数,且奇数的因数也没有偶数,因此可以进一步优化。
def is_prime3(x):if x == 2:return Trueelif x % 2 == 0:return Falsefor i in range(3, int(x ** 0.5) + 1, 2):if x % i == 0:return Falsereturn True# 算法四:任何一个自然数,总可以表示成以下六种形式之一:6n,6n+1,6n+2,6n+3,6n+4,6n+5(n=0,1,2...)我们可以发现,除了2和3,只有形如6n+1和6n+5的数有可能是质数。且形如6n+1和6n+5的数如果不是质数,它们的因数也会含有形如6n+1或者6n+5的数,因此可以得到如下算法:
def is_prime4(x):if (x == 2) or (x == 3):return Trueif (x % 6 != 1) and (x % 6 != 5):return Falsefor i in range(5, int(x ** 0.5) + 1, 6):if (x % i == 0) or (x % (i + 2) == 0):return Falsereturn True

四、Numba

4.1 官方文档

numba 是一款可以将 python 函数编译为机器代码的JIT编译器,经过 numba 编译的python 代码(仅限数组运算),其运行速度可以接近 C 或 FORTRAN 语言。
官方文档链接:http://numba.pydata.org/numba-doc/latest/index.html

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

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

相关文章

基于STM32的智能手环设计与实现

需要原理图工程&#xff0c;源码&#xff0c;PCB工程的朋友收藏&#xff0c;这篇文章关注我&#xff0c;私我吧&#xff01;&#xff01;&#xff01; 基于STM32的智能手环设计与实现 摘要一、研究背景及意义二、实现功能三、系统方案设计系统方案设计框图3.1 单片机芯片选择3…

[HGAME 2023 week1]easyenc

查壳 IDA打开 字符串打开就发现了明显的标志 int __cdecl main(int argc, const char **argv, const char **envp) {__int64 v3; // rbx__int64 v4; // raxchar v5; // alchar *v6; // rcxint v8[10]; // [rsp20h] [rbp-19h]char v9; // [rsp48h] [rbpFh]__int128 v10[3]; //…

【Java】SpringMVC参数接收(一)

1、接收单个参数 &#xff08;1&#xff09;直接接收参数 RequestMapping("/hello") RestController public class HelloSpring {RequestMapping("/t2")public String t2(String name){return "name" name;} } 当没有传入参数时&#xff0c;返…

《汇编语言:基于linux环境》eatsyscall汇编程序

当阅读此书&#xff0c;作者编写了一个这样的程序&#xff0c;我也想试一下。照着书中的代码写了下&#xff0c;可以使用nasm正常编译&#xff0c;ld也可以正常链接&#xff0c;但是无法正常执行。总是报错。 ; nasm -f elf64 -g -F stabs eatsyscall.asm ; ld -o eatsysca…

sqli-labs靶场第七关

7、第七关 id1 --单引号报错,id1" --双引号不报错,可以判断是单引号闭合 id1) --也报错&#xff0c;尝试两个括号闭合&#xff0c;id1)) --不报错 接下来用脚本爆库 import stringimport requestsnumbers [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] letters2 list(string.ascii_…

【销售数据分析】客户画像分析之总体画像

前一段时间把财务分析的一些报表及分析场景讲得差不多了&#xff0c;接下来想和大家讲一下销售分析中的一些场景。今年看了许多企业的数据&#xff0c;发现大家2023年比疫情三年更难&#xff01;从财务的几张报表就会发现净利润亏损的居多&#xff0c;而亏损的主要原因基本上都…

Easysearch:语义搜索、知识图和向量数据库概述

什么是语义搜索&#xff1f; 语义搜索是一种使用自然语言处理算法来理解单词和短语的含义和上下文以提供更准确的搜索结果的搜索技术。旨在更好地理解用户的意图和查询内容&#xff0c;而不仅仅是根据关键词匹配&#xff0c;还通过分析查询的语义和上下文来提供更准确和相关的…

什么是DevOps?DevOps是如何提效的?

文章目录 前言一、DevOps是什么&#xff1f;二、DevOps是如何提效的&#xff1f;总结 前言 随着软件行业的不断发展&#xff0c;如何打破开发、运维、测试之间的边界&#xff0c;使工作更加高效成为了企业的新一个难题&#xff0c;本文将向大家介绍DevOps文化&#xff0c;以及…

巨杉数据库携手广发证券入选2023大数据“星河”案例

近期&#xff0c;中国信息通信研究院、中国通信标准化协会大数据技术标准推进委员会(CCSA TC601)连续七年共同组织的大数据“星河&#xff08;Galaxy&#xff09;”案例征集活动发布公示。本次征集活动&#xff0c;旨在通过总结和推广大数据产业发展的优秀成果&#xff0c;推动…

C++多线程1(复习向笔记)

创建线程以及相关函数 当用thread类创建线程对象绑定函数后&#xff0c;该线程在主线程执行时就已经自动开始执行了,join起到阻塞主线程的作用 #include <iostream> #include <thread> #include <string> using namespace std; //测试函数 void printStrin…

被鹅厂最新开源AI绘画工具PhotoMaker圈粉了,多风格头像生成器就靠它了!

要说本周AIGC开源爆火项目&#xff0c;腾讯的PhotoMaker 可以入选其一。而 PhotoMaker 是腾讯Arc于4天前开源上线到GitHub的&#xff0c;更有一众互联网科技领域大V体验推荐&#xff0c;当前Star已经有4.7k了&#xff01; 相信小编这篇文章发布时star预测可能达到5k了。而 Pho…

js打地鼠

文章目录 1实现效果2代码实现 1实现效果 游戏难度&#xff1a;简单&#xff0c;一般&#xff0c;困难&#xff0c;噩梦&#xff08;控制setInterval的time参数&#xff09; 按钮功能&#xff1a;结束&#xff08;可以通过修改gameScore的值来修改判定结束的分数&#xff09;&am…

3个精美的wordpress律师网站模板

暗红色WordPress律师事务所网站模板 演示 https://www.zhanyes.com/qiye/23.html 暗橙色WordPress律师网站模板 演示 https://www.zhanyes.com/qiye/18.html 红色WordPress律所网站模板 演示 https://www.zhanyes.com/qiye/22.html

2023 IoTDB Summit:Dr. Feinauer《Apache IoTDB在德国工业和关键基础设施中的应用》

12 月 3 日&#xff0c;2023 IoTDB 用户大会在北京成功举行&#xff0c;收获强烈反响。本次峰会汇集了超 20 位大咖嘉宾带来工业互联网行业、技术、应用方向的精彩议题&#xff0c;多位学术泰斗、企业代表、开发者&#xff0c;深度分享了工业物联网时序数据库 IoTDB 的技术创新…

Biotin-PEG4-TSA,生物素-PEG4-酪胺,用于标记蛋白质、核酸等生物分子

您好&#xff0c;欢迎来到新研之家 文章关键词&#xff1a;Biotin-PEG4-Tyramide&#xff0c;Biotin-PEG4-TSA&#xff0c;生物素-PEG4-酪胺&#xff0c;Biotin PEG4 Tyramide&#xff0c;Biotin PEG4 TSA 一、基本信息 产品简介&#xff1a;Biotin PEG4 Tyramide is compos…

React 中条件渲染的 N 种方法

本文作者系360奇舞团前端开发工程师 条件渲染在React开发中非常重要的功能&#xff0c;它允许开发人员根据条件控制渲染的内容&#xff0c;在创建动态和交互式用户界面方面发挥着至关重要的作用&#xff0c;本文总结了常用的的条件渲染方法。 1.If-else if-else是一种控制流程…

基于Micropython利用ESP32-C3驱动墨水屏显示图片

从咸鱼上淘了两块2.9寸的墨水屏价签&#xff0c;可以结合ESP32-C3做个低功耗的时钟温湿度计。 1、所需硬件 合宙的ESP32-C3&#xff1a; 电子价签拆出来的2.9寸墨水屏&#xff1a; ——电子价签型号为&#xff1a;Stellar-L&#xff0c;墨水屏型号为&#xff1a;E029A01。电子…

vue3之echarts3D环柱图

vue3之echarts3D环柱图 效果&#xff1a; 核心代码&#xff1a; <template><div class"container"><div ref"chartRef" class"charts"></div></div> </template><script lang"ts" setup&g…

3. SQL 语言

重点&#xff1a; MySQL 的 三种安装方式&#xff1a;包安装&#xff0c;二进制安装&#xff0c;源码编译安装。 MySQL 的 基本使用 MySQL 多实例 DDLcreate alter drop DML insert update delete DQL select 3&#xff09;SQL 语言 3.1&#xff09;关系型数据库的常见…

探索Pyecharts关系图绘制技巧:炫酷效果与创意呈现【第42篇—python:Pyecharts水球图】

文章目录 Pyecharts绘制多种炫酷关系网图引言准备工作代码实战1. 基本关系网图2. 自定义节点样式和边样式3. 关系网图的层级结构4. 添加标签和工具提示5. 动态关系网图6. 高级关系网图 - Les Miserables 示例7. 自定义关系网图布局8. 添加背景图9. 3D 关系网图10. 热力关系网图…