NumExpr加速计算(numpy表达式)

news2024/9/20 23:49:19

文章目录

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

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 plt


def 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_time
        numexpr_times.append(numexpr_time)

        # 使用numpy计算
        start_time = time.time()
        x_numpy = (a ** 2 + b ** 2) / (a + b + 1e-10)
        numpy_time = time.time() - start_time
        numpy_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.coloradmin.cn/o/2064101.html

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

相关文章

软考高级科目怎么选?

首先上图 从图片中可以看出来,在软件开发中考试方向为程序员-软件设计师-系统架构师或者系统分析师。 系统分析师与系统架构师工作内容: 系统分析师:在信息系统项目开发过程中负责制定信息系统需求规格说明书和项目开发计划、指导和协调信息…

在网站文章中,‌<br>标签对SEO的影响及优化策略

在网页设计和内容创作中&#xff0c;‌<br>标签常被用于实现文本的换行显示。‌然而&#xff0c;‌对于关注SEO&#xff08;‌搜索引擎优化&#xff09;‌的网站管理员和内容创作者来说&#xff0c;‌<br>标签的使用却需要更加谨慎。‌这是因为<br>标签对SEO…

Linux系统编程全面学习

应用层&#xff1a;写一个QT可执行程序、一个C程序 驱动层&#xff1a;写一个LED、蜂鸣器、pwm驱动 硬件层&#xff1a;焊接、layout Linux系统介于应用层和驱动层之间&#xff0c;Linux系统会向应用层提供接口&#xff0c;学习使用的基本是Linux内核向用户提供的接口或者可以…

理解Tomcat的IP绑定与访问控制

在使用Spring Boot开发应用时&#xff0c;内置的Tomcat容器提供了灵活的网络配置选项。特别是&#xff0c;当计算机上有多个网卡时&#xff0c;如何配置server.address属性显得尤为重要。本文将详细探讨不同IP配置对Tomcat服务访问的影响。 多网卡环境下的IP配置 假设你的计算…

java 8种基础数据类型

1、数据范围 2、各个类型转换 实线转换&#xff1a;无信息丢失的自动转换&#xff0c;反方向需要强制类型转换&#xff0c;如&#xff08;int) 虚线转换&#xff1a;可能存在精度丢失 精度丢失示例如下&#xff1a; long l 123456787654321L; float f l; System.out.prin…

框架漏洞大全【万字总结】

文章目录 常见语言开发框架&#xff1a;Thinkphp远程代码执行5.0.23 rce介绍影响版本复现 CNVD-2018-24942介绍影响版本复现 任意文件包含包含日志-3.2x介绍影响版本复现 包含语言&#xff08;QVD-2022-46174&#xff09;介绍影响版本复现 sql注入漏洞(5.0.x)介绍影响版本复现 …

太上老君的“三味真火”也可以提升3D NAND可靠性!

《西游记》中孙悟空因在太上老君的炼丹炉中历经九九八十一难&#xff0c;最终炼就了一双能够洞察一切妖魔鬼怪真身的“火眼金睛”。这双神奇的眼睛&#xff0c;仿佛预示着一种古老的智慧——通过火的考验&#xff0c;可以淬炼出更加坚韧的灵魂。 而在现代科技的洪流中&#xff…

软件测试-自动化测试

自动化测试 测试人员编写自动化测试脚本&#xff0c;维护并解决自动化脚本问题 自动化的主要目的就是用来进行回归测试 回归测试 常见面试题 ⾃动化测试能够取代人工测试吗&#xff1f; ⾃动化测试不⼀定⽐人工测试更能保障系统的可靠性&#xff0c;⾃动化测试是测试⼈员手…

vue2项目从0到1记录

脚手架需要安装完 npm install -g vue/cli1. 使用脚手架创建项目 vue create 项目名2. 引入样式重置normalize.css插件 // 统一浏览器样式 安装&#xff1a;npm install --save normalize.css 引入&#xff1a;import normalize.css/normalize.css3. 根据部署环境判断是否要…

MyBatis[进阶]

大纲: 动态SQL查询 留言板 1. 动态SQL 1.1 <if> 我们都注册过一些信息,有的信息是非必填项,改如何实现呢? 这个时候就需要使⽤动态标签来判断了 ⽐如添加的时候性别gender为⾮必填字段&#xff0c;具体实现如 下&#xff1a; 注解: 如果性别为空: 如果性别不为空:…

你真的会用大模型吗,探索提示词工程的魅力

相信在这一两年内&#xff0c;每个人都尝试使用了各种大模型。不知大家有没有发现&#xff0c;它们的质量参差不齐&#xff0c;回答的内容也不一定准确。随着人工智能技术的快速发展&#xff0c;越来越多的模型被开发出来并用于各种应用&#xff0c;但并非所有模型都能够提供可…

Leetcode每日刷题之904.水果成篮

1.题目解析 本题的题目要求较长&#xff0c;不过理解起来较为简单&#xff0c;就是在给定数组内找出最长子数组&#xff0c;并且该最长子数组只能有两种数字&#xff0c;最后返回该符合条件的最长子数组的长度即可 题目来源&#xff1a;904.水果成篮 2.算法原理 本题的核心是找…

组件提前渲染

问题&#xff1a; 组件正常引入并使用的过程中&#xff0c;出现组件第一次渲染不显示&#xff0c;只有再次刷新页面才显示的问题 <el-table-column label"图纸规定" align"center" prop"tzgd" v-if"mbform.zbzd.tzgd" width"…

动手实现基于Reactor模型的高并发Web服务器(一):epoll+多线程版本

系统流程概览 main函数 对于一个服务器程序来说&#xff0c;因为要为外部的客户端程序提供网络服务&#xff0c;也就是进行数据的读写&#xff0c;这就必然需要一个 socket 文件描述符&#xff0c;只有拥有了文件描述符 C/S 两端才能通过 socket 套接字进行网络通信&#xff0…

【深海王国】小学生都能玩的单片机!番外2:Arduino控制其他元器件

Hi٩(๑ ^ o ^ ๑)۶, 各位深海王国的同志们&#xff0c;早上下午晚上凌晨好呀~辛勤工作的你今天也辛苦啦 (o゜▽゜)o☆ 今天大都督为大家带来单片机的新番外系列——小学生都能玩的单片机&#xff01;番外2&#xff1a;Arduino控制其他元器件&#xff0c;带你学习如何使用Ard…

性能测试面试问答题

1、性能测试怎么测试&#xff1f; 性能测试其实就是通过自动化工具模拟多种正常、峰值以及异常负载来对系统的各项性能指标进行测试。负载测试和压力测试都属于性能测试&#xff0c;二者可结合使用。 性能指标主要有平均响应时间、90%响应时间、吞吐量、吞吐率&#xff0c;每…

基于SpringBoot的私房菜定制上门服务系统的设计与实现pf

TOC springboot512基于SpringBoot的私房菜定制上门服务系统的设计与实现pf 第1章 绪论 1.1 课题背景 二十一世纪互联网的出现&#xff0c;改变了几千年以来人们的生活&#xff0c;不仅仅是生活物资的丰富&#xff0c;还有精神层次的丰富。在互联网诞生之前&#xff0c;地域…

图书项目要点

一、搭建项目 使用tarojs/cli进行搭建 taro init [项目名] 二、具体页面 页面声明&#xff1a; 在【app.config.ts】中对主页面进行声明&#xff1a;组件页面可以不用声明 pages: ["pages/index/index",pages/user/index,pages/book/index,], tabbar制作&…

Linux系统编程(14)UDP全双工通信和TCP半双工通信

一、UDP全双工通信 UDP通信基础&#xff1a; recvfrom函数 recvfrom 是一个用于接收数据的函数&#xff0c;&#xff0c;但 recvfrom 不仅接收数据&#xff0c;还可以获取发送数据的地址信息。 ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sock…

【vue3|第25期】Vue3中的useRoute:轻松访问路由信息

日期&#xff1a;2024年8月21日 作者&#xff1a;Commas 签名&#xff1a;(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释&#xff1a;如果您觉在这里插入代码片得有所帮助&#xff0c;帮忙点个赞&#xff0c;也可以关注我&#xff0c;我们一起成长&#xff1b;如果有不…