0


NumExpr加速计算(numpy表达式)

文章目录

Python 性能优化:NumExpr + Numba + CuPy

一、简介

  1. numexpr(全称:numpy expression

:用于在 NumPy 表达式上快速执行元素级运算的 Python 加速库。

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

表达式:是由变量、运算符和函数组成的符号序列,用于表示计算过程或计算结果。如:

  1. "(a**2 + b**2) / (a + b + 1e-10)"
  • 变量:表示数据或值的符号,可以是数值、字符串、布尔值等。
  • 运算符:如:算术运算符、逻辑运算符、比较运算符等。Python运算符
  • 函数:如:数学函数、三角函数等。Python函数

二、安装

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

三、函数详解

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

四、性能评估

NumExpr简介

在这里插入图片描述

  1. import time
  2. import numpy as np
  3. import numexpr
  4. import matplotlib.pyplot as plt
  5. defcompare_performance():
  6. numexpr_times =[]
  7. numpy_times =[]
  8. ns =range(10,500,10)for n in ns:# 生成表达式
  9. np.random.seed(0)
  10. a = np.random.rand(n, n, n)
  11. b = np.random.rand(n, n, n)
  12. expression ="(a**2 + b**2) / (a + b + 1e-10)"# 使用numexpr计算
  13. start_time = time.time()
  14. x_numexpr = numexpr.evaluate(expression)
  15. numexpr_time = time.time()- start_time
  16. numexpr_times.append(numexpr_time)# 使用numpy计算
  17. start_time = time.time()
  18. x_numpy =(a **2+ b **2)/(a + b +1e-10)
  19. numpy_time = time.time()- start_time
  20. numpy_times.append(numpy_time)print(f"n={n}: numexpr_time={numexpr_time:.5f} seconds, numpy_time={numpy_time:.5f} seconds")
  21. plt.figure(figsize=(10,6))
  22. plt.plot(ns, numexpr_times, marker='o', label='numexpr')
  23. plt.plot(ns, numpy_times, marker='o', label='numpy')
  24. plt.title('Performance Comparison of numexpr vs numpy')
  25. plt.xlabel('Three-dimensional array [n, n, n]')
  26. plt.ylabel('Time (seconds)')
  27. plt.legend()
  28. plt.grid(True)
  29. plt.show()if __name__ =="__main__":
  30. compare_performance()

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

  1. import time
  2. import numpy as np
  3. # 创建大型数据集
  4. np.random.seed(0)
  5. n =1000
  6. a = np.random.rand(n, n, n)# 三维数组:100x100x100
  7. b = np.random.rand(n, n, n)# 三维数组:100x100x100
  8. expression ="(a**2 + b**2) / (a + b + 1e-10)"# (1)使用 numexpr 评估表达式import numexpr
  9. start_time = time.time()
  10. x_numexpr = numexpr.evaluate(expression)print(f"numexpr时耗: {time.time()- start_time:.5f} 秒")# 2)直接使用 Python 原生操作计算
  11. start_time = time.time()
  12. 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)}")"""
  13. numexpr时耗: 0.97169 秒
  14. Python 时耗: 9.74043 秒
  15. 两种方法计算结果是否一致: True
  16. """
标签: numexpr numpy python

本文转载自: https://blog.csdn.net/shinuone/article/details/137924600
版权归原作者 胖墩会武术 所有, 如有侵权,请联系我们删除。

“NumExpr加速计算(numpy表达式)”的评论:

还没有评论