NumExpr加速计算(numpy表达式)

文章目录

  • 一、简介
  • 二、安装
  • 三、函数详解
  • 四、性能评估

Python 性能优化:NumExpr + Numba + CuPy

一、简介

numexpr(全称:numpy expression)用于在 NumPy 表达式上快速执行元素级运算的 Python 加速库。

  • 优势:将表达式转换为高效的机器码,然后在内部优化执行并行计算。
    • 利用多核处理器并行计算:在计算表达式时并行执行操作,从而加快计算速度。
    • 基于缓存的内存管理策略在计算过程中,避免创建临时数组来减少内存占用。
  • 局限性:只有在处理大型数据集时,才会比标准的 NumPy 表达式速度更快;
  • 适用范围:只适用于 NumPy 表达式;

表达式:是由变量、运算符和函数组成的符号序列,用于表示计算过程或计算结果。如:"(a**2 + b**2) / (a + b + 1e-10)"

  • 变量:表示数据或值的符号,可以是数值、字符串、布尔值等。
  • 运算符:如:算术运算符、逻辑运算符、比较运算符等。Python运算符
  • 函数:如:数学函数、三角函数等。Python函数

二、安装

  • pip安装:pip install numexpr
  • conda安装:conda install numexpr

三、函数详解

"""#####################################################################################################################
# 函数功能:用于在 NumPy 表达式上快速执行元素级运算的 Python 加速库。
# 函数说明:numexpr.evaluate(expression, local_dict=None, global_dict=None, out=None, order='K', casting='safe', **kwargs)
# 参数说明:
#         expression (str):               要评估的数学表达式。
#         local_dict (dict, optional):    本地命名空间中的变量字典。
#         global_dict (dict, optional):   全局命名空间中的变量字典。
#         out (ndarray, optional):        结果存储的数组。若提供,则结果存储在该数组中。
#         order (str, optional):          数组存储顺序。如:'C'(行优先)、'F'(列优先)、'K'(与数组的存储顺序相同)。
#         casting (str, optional):        指定如何处理数据类型转换,如:'no'(不允许转换)、'equiv'(仅当转换安全)、'safe'(只允许安全转换)。
#         **kwargs:其他参数传递给底层的 numexpr 引擎。
# 返回参数:
#         out (ndarray):                  若提供,则返回结果数组;否则返回一个新的数组。
#####################################################################################################################"""

四、性能评估

NumExpr简介

在这里插入图片描述

import time
import numpy as np
import numexpr
import matplotlib.pyplot as pltdef compare_performance():numexpr_times = []numpy_times = []ns = range(10, 500, 10)for n in ns:# 生成表达式np.random.seed(0)a = np.random.rand(n, n, n)b = np.random.rand(n, n, n)expression = "(a**2 + b**2) / (a + b + 1e-10)"# 使用numexpr计算start_time = time.time()x_numexpr = numexpr.evaluate(expression)numexpr_time = time.time() - start_timenumexpr_times.append(numexpr_time)# 使用numpy计算start_time = time.time()x_numpy = (a ** 2 + b ** 2) / (a + b + 1e-10)numpy_time = time.time() - start_timenumpy_times.append(numpy_time)print(f"n={n}: numexpr_time={numexpr_time:.5f} seconds, numpy_time={numpy_time:.5f} seconds")plt.figure(figsize=(10, 6))plt.plot(ns, numexpr_times, marker='o', label='numexpr')plt.plot(ns, numpy_times, marker='o', label='numpy')plt.title('Performance Comparison of numexpr vs numpy')plt.xlabel('Three-dimensional array [n, n, n]')plt.ylabel('Time (seconds)')plt.legend()plt.grid(True)plt.show()if __name__ == "__main__":compare_performance()

不循环调用:三维数组 = [1000, 1000, 1000]

import time
import numpy as np# 创建大型数据集
np.random.seed(0)
n = 1000
a = np.random.rand(n, n, n)  # 三维数组:100x100x100
b = np.random.rand(n, n, n)  # 三维数组:100x100x100
expression = "(a**2 + b**2) / (a + b + 1e-10)"# (1)使用 numexpr 评估表达式
import numexpr
start_time = time.time()
x_numexpr = numexpr.evaluate(expression)
print(f"numexpr时耗: {time.time() - start_time:.5f} 秒")# (2)直接使用 Python 原生操作计算
start_time = time.time()
x_python = (a ** 2 + b ** 2) / (a + b + 1e-10)
print(f"Python 时耗: {time.time() - start_time:.5f} 秒")print(f"结果是否一致: {np.allclose(x_numexpr, x_python)}")"""
numexpr时耗: 0.97169 秒
Python 时耗: 9.74043 秒
两种方法计算结果是否一致: True
"""

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

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

相关文章

python非交互连接mysql+mycat读写分离实现

python非交互连接mysql >>>import pymysql >>>connpymysql.connect(host"192.168.118.57",port3306,database"test",user"root",password"root") >>> cursorconn.cursor() >>> cursor.execut…

Element-ui table进阶使用

最近项目有多个报表开发的需求,我采用的是凤翎前端组件框架(基于element-ui开发),大伙可以直接参考element-ui组件库文档,把标签中的fks替换为el即可。下面我会按顺序一一展开细说这些需求: 1、有多级表头…

AI大模型开发——7.百度千帆大模型调用

本节旨在为读者提供一个实用指南,探讨如何有效地利用百度千帆大模型平台的强大功能。从基础的账号注册和密钥申请入手,逐步引领用户通过案例, 理解并掌握如何调用文本和图像处理的大模型 API, 包括但不限于 NLP、对话生成、文本续…

CV每日论文--2024.7.25

1、Diffusion Models for Monocular Depth Estimation: Overcoming Challenging Conditions 中文标题:单目深度估计的扩散模型:克服具有挑战性的条件 简介:本文提出了一种新颖的方法,旨在解决单张图像深度估计任务中具有挑战性的、超出分布范…

linux 磁盘满了,程序运行失败,如何处理?df -h

场景:紧急呼救,上传图片失败了。我一脸懵,服务器这是又咋地了,别邪乎姐姐,姐姐胆子小啊。 一、寻找问题原因 1、OSS出问题了? 然后我尝试了 IOS 的APP是没问题的,Android提示上传失败&#xf…

在Kubernetes中通过 pod 打开 pod所在宿主机上的shell

昨日一伙计突然问我 在么把自己打好的 docker镜像 上传到 kubernetes 的 节点的 local 镜像池。 现状大约如下: 1)只有master节点的登录权限; 2)不知道存在哪些worker节点也无法通过 master 借助SSH 登录到 worker节点 &#x…

MyBatis入门(上)---初识

在应⽤分层学习时, 我们了解到web应⽤程序⼀般分为三层,即:Controller、Service、Dao . 之前的案例中,请求流程如下: 浏览器发起请求, 先请求Controller, Controller接收到请求之后, 调⽤ Service进⾏业务逻辑处理, Service再调⽤Dao, 但是Da…

消化学科的领军人物陈烨教授在会议上作了《幽门螺杆菌的规范检测与质控》的专题报告

由广东省药学会主办的“第十九届消化疾病诊疗会暨胃肠疾病药物临床研究交流会”于2024年8月8日-9日在广东省深圳市召开。陈烨教授,作为消化学科的领军人物、中华医学会消化病学分会的常务委员,以及全国幽门螺杆菌学组的组长,在会议上作了《幽…

【仿真与实物设计】基于51单片机设计的打地鼠游戏机——程序源码原理图proteus仿真图PCB设计文档演示视频元件清单等(文末工程资料下载)

基于51单片机设计的打地鼠游戏机 演示视频: 基于51单片机设计的打地鼠游戏机 功能描述:使用 51单片机为核心制作一个打地鼠游戏机。按下启动开关,8盏LED流水点亮并闪烁2次,随即开始播放游戏音乐,直到开始选择模式。选…

CTF密码学小结

感觉没啥好总结的啊 基础的永远是RSA、流密码、哈希、对称密码、古典密码那一套(密码学上过课都会),其他的就是数论的一些技巧 似乎格密码也很流行,以及一些奇奇怪怪的性质利用也很多 1、random设置种子后随机的性质&#xff1a…

ORM底层的原理

2.3.面试题3:请介绍什么是ORM思想: a.什么是ORM: 1.所谓的ORM是Dao层的一种思想,意思就是对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping…

Excel技巧(一)

快捷键技巧 原文链接 选取某一行的数据直到最后一行:【CTRL SHIFT ↓ 】或者选取一行后按住SHIFT键,双击下边线就可以快速选取区域。 如果表格中有多行空行,可以先按CTRL SHIFT END,再按CTRL SHIFT 上下键调整,…

读懂 GraphRAG:提升LLM企业落地能力,智能问答革命

在企业中单纯的使用LLM并不会产生太好的效果,因为它们不会对有关组织活动的特定领域专有知识进行编码,而这些知识实际上会给信息对话界面带来价值萃取。很多企业尝试通过RAG来优化这个过程,并且越来越多的人在RAG的方向上不断的研究&#xff…

【蓝桥杯集训100题】scratch游泳时长 蓝桥杯scratch比赛专项预测编程题 集训模拟练习题第27题

目录 scratch游泳时长 一、题目要求 编程实现 二、案例分析 1、角色分析 2、背景分析 3、前期准备 三、解题思路 1、思路分析 2、详细过程 四、程序编写 五、考点分析 六、推荐资料 1、入门基础 2、蓝桥杯比赛 3、考级资料 4、视频课程 5、python资料 scratc…

《黑神话.悟空》与人工智能AI重塑经典与探索未来的交织

"近期我偶然邂逅了一个极为出色的人工智能学习平台,它不仅内容深入浅出,讲解方式还风趣幽默,让人学习起来既轻松又高效。如此宝藏资源,我迫不及待想要与各位共享。即刻点击让我们一起进入这个精彩纷呈的学习网站吧&#xff0…

[java][代码]使用java在mongodb上传下载文件

建立java项目新建lib包&#xff0c;导入jar包 3.链接mongdo数据库代码 /** * 1.获取连接 * 2.上传文件 * 3.下载文件 * 4.删除文件 * */ public static GridFS GetMongoGridFS(){ List<ServerAddress> adds new ArrayList<>(); ServerAddress serverAddress new…

Python | Leetcode Python题解之第352题将数据流变为多个不想交区间

题目&#xff1a; 题解&#xff1a; from sortedcontainers import SortedDictclass SummaryRanges:def __init__(self):self.intervals SortedDict()def addNum(self, val: int) -> None:intervals_ self.intervalskeys_ self.intervals.keys()values_ self.intervals…

C# SolidWorks 二次开发-103.模拟库拖拽

最近躺平状态&#xff0c;所有没有更新。 为了搜索量再高一点&#xff0c;我决定让排名上升一个名次&#xff0c;今天来写一篇关于如何假装自己有个库。 如上图&#xff0c;进行一个拖拽示例&#xff0c;从自己的窗体中将文件带入solidworks中打开 或者 装配动作。与手动从文…

多商户平台后台上传不了文件

错误&#xff0c;点击上传没反应&#xff0c;也无错误提示 解决方法&#xff1a; 检查商城域名配置&#xff0c;http 和 https&#xff0c;与访问的http或https是否一致&#xff1b;

iOS App上架审核被拒——2.3.3 - Performance - Accurate Metadata

iOS上架审核被拒——Guideline 2.3.3 - Performance - Accurate Metadata 噢&#xff0c;又被拒了… 文章目录 iOS上架审核被拒——Guideline 2.3.3 - Performance - Accurate Metadata被拒原因解决 被拒原因 大概翻译了下&#xff1a;预览图问题&#xff0c;只因某张预览图加了…