NumExpr教程:让NumPy计算提速4倍以上的高性能表达式引擎
2026/6/12 7:51:52 网站建设 项目流程

NumExpr教程:让NumPy计算提速4倍以上的高性能表达式引擎

大家好 这里是「代码简单说」`,欢迎大家关注同名公众号,不定时更新更多实用有趣的教程 也欢迎大家在评论区一起讨论交流!~

关键词:NumExpr教程、NumExpr安装、NumExpr使用方法、NumPy性能优化、Python科学计算加速、数组计算加速、多线程计算、MKL优化、NumExpr与NumPy对比

在处理大规模数据分析、机器学习预处理、科学计算时,很多开发者都会遇到一个问题:

c=a*b-4.1*a>2.5*b

这类代码写起来简单,但当数组达到几百万甚至上亿条数据时,计算速度和内存占用都会成为瓶颈。

最近在优化一个数据分析项目时,发现了一个专门用于加速 NumPy 表达式计算的库——NumExpr

官方测试数据显示:

  • 简单表达式可达到 NumPy 的 0.95~2 倍速度
  • 复杂表达式可达到 4 倍以上速度
  • 某些数学函数甚至可获得 15 倍加速

今天就详细介绍一下这个性能神器。


什么是 NumExpr

NumExpr 是一个专门为 NumPy 数组计算设计的高性能表达式求值器(Numerical Expression Evaluator)。

项目地址:

https://github.com/pydata/numexpr

官方文档:

https://numexpr.readthedocs.io/

它能够直接解析字符串形式的数学表达式:

"3*a+4*b"

然后通过内部虚拟机执行计算。

相比 NumPy 传统运算方式:

result=3*a+4*b

NumExpr 具有以下优势:

特性NumPyNumExpr
避免中间数组
CPU缓存优化
多线程计算有限
MKL加速部分支持
大数组性能一般优秀

NumExpr为什么这么快

很多开发者以为:

a*b+c

只是一条运算。

实际上 NumPy 内部通常会经历:

temp=a*b result=temp+c

产生一个中间数组:

a b ↓ temp ↓ result

如果数组很大:

100000000

那么:

额外内存 = 100000000 × 8 Byte ≈ 800MB

仅临时变量就可能占用数百 MB 内存。


NumExpr的优化方案

NumExpr不会创建完整中间数组。

而是:

数组 ↓ 切块(chunk) ↓ CPU缓存 ↓ 计算 ↓ 输出结果

例如:

100000000元素

被拆分为:

Chunk1 Chunk2 Chunk3 ...

每块放入 CPU Cache 后计算。

优点:

  • 更少内存访问
  • 更高缓存命中率
  • 更少临时对象
  • 更好的CPU利用率

NumExpr内部工作原理

NumExpr并不是直接调用Python解释器。

执行流程:

表达式字符串 ↓ 解析器(Parser) ↓ 生成Opcode ↓ 虚拟机(VM) ↓ 多线程执行 ↓ 返回结果

例如:

"a*b-4.1*a>2.5*b"

会被转换成内部操作码。

随后:

CPU核心1 → Chunk1 CPU核心2 → Chunk2 CPU核心3 → Chunk3 CPU核心4 → Chunk4

并行执行。

因此在多核CPU上性能提升非常明显。


NumExpr安装教程

使用pip安装

最简单方式:

pipinstallnumexpr

查看版本:

python-c"import numexpr;print(numexpr.__version__)"

Conda安装

如果使用:

  • Anaconda
  • Miniconda

推荐:

condainstallnumexpr

因为 Conda 版本通常自带 MKL 支持。


测试安装是否成功

执行:

python-c"import numexpr; numexpr.test()"

如果看到:

OK

说明安装成功。


NumExpr基础使用

导入模块

importnumpyasnpimportnumexprasne

创建测试数据:

a=np.arange(1000000)b=np.arange(1000000)

示例1:简单表达式

NumPy:

a+1

NumExpr:

ne.evaluate("a + 1")

输出:

array([1.,2.,3.,...1000000.])

示例2:复杂条件判断

NumPy:

a*b-4.1*a>2.5*b

NumExpr:

ne.evaluate("a * b - 4.1 * a > 2.5 * b")

返回:

array([False,False,...True])

复杂表达式通常能获得更明显加速。


示例3:数学函数

NumExpr支持大量数学运算。

例如:

ne.evaluate("sin(a) + arcsinh(a/b)")

结果:

array([...])

支持:

函数类型示例
三角函数sin、cos、tan
反三角函数arcsin、arccos
指数函数exp
对数函数log
双曲函数sinh、cosh
平方根sqrt
绝对值abs

示例4:字符串数组

很多人不知道:

NumExpr还支持字符串比较。

s=np.array([b'abba',b'abbb',b'abbcdef'])

判断:

ne.evaluate("b'abba' == s")

结果:

array([True,False,False])

NumExpr性能测试

NumPy方式

importnumpyasnpimporttime a=np.random.rand(10000000)b=np.random.rand(10000000)start=time.time()result=a*b-4.1*a>2.5*bprint(time.time()-start)

NumExpr方式

importnumexprasneimportnumpyasnpimporttime a=np.random.rand(10000000)b=np.random.rand(10000000)start=time.time()result=ne.evaluate("a*b-4.1*a>2.5*b")print(time.time()-start)

典型性能对比

官方给出的经验数据:

表达式复杂度性能提升
a+10.95x~1.5x
a+b+c+d1.5x~2.5x
ab-4.1a>2.5*b2x~4x
复杂数学函数5x~15x

MKL加速支持

NumExpr支持:

Intel MKL Intel VML

即:

Math Kernel Library Vector Math Library

对于:

sin()cos()exp()log()

等函数可进一步提升速度。


开启MKL

创建:

site.cfg

配置MKL路径:

[mkl] library_dirs = ... include_dirs = ...

重新编译:

pipinstall.

编译日志中会显示:

MKL detected

说明启用成功。


多线程支持

NumExpr最强大的特性之一:

自动多线程

计算时能够同时使用:

CPU核心1 CPU核心2 CPU核心3 CPU核心4 ...

例如:

importnumexprasneprint(ne.detect_number_of_cores())

输出:

16

设置线程数:

ne.set_num_threads(8)

查看线程数:

ne.get_num_threads()

Python 3.13无GIL支持

从:

CPython 3.13

开始提供 Free Threading 版本。

即:

无GIL模式

NumExpr已经能够在这种环境下运行。

官方建议:

方案1

使用:

Python主线程 + NumExpr内部多线程

方案2

使用:

多个Python线程 + NumExpr单线程

避免:

线程过度订阅 (Oversubscription)

导致性能下降。


NumExpr适合哪些场景

数据分析

Pandas底层大量使用NumPy:

DataFrame Series

大规模筛选时收益明显。


科学计算

例如:

矩阵计算 统计分析 数值模拟

机器学习预处理

特征工程:

归一化 标准化 数学变换

金融量化

指标计算:

RSI MACD KDJ ATR

需要处理大量时间序列数据。


NumExpr与NumPy对比

项目NumPyNumExpr
易用性★★★★★★★★★☆
生态★★★★★★★★☆☆
简单运算★★★★★★★★★☆
复杂表达式★★★☆☆★★★★★
内存占用★★★☆☆★★★★★
多线程能力★★☆☆☆★★★★★
超大数组计算★★★☆☆★★★★★

总结

NumExpr 是一个专门针对 NumPy 数组表达式优化的高性能计算库。

核心优势包括:

  • 避免创建中间数组
  • 减少内存占用
  • 提高CPU缓存利用率
  • 自动多线程并行计算
  • 支持Intel MKL/VML加速
  • 复杂表达式最高可获得15倍性能提升

如果你的项目中存在大量类似:

a*b+c*d-e
sin(x)+log(y)
(a>0)&(b<100)

这样的 NumPy 数组计算,那么 NumExpr 是非常值得引入的性能优化工具。

项目地址:

资源链接
GitHubhttps://github.com/pydata/numexpr
官方文档https://numexpr.readthedocs.io/
PyPIhttps://pypi.org/project/numexpr/

对于数据分析、机器学习、量化计算以及科学计算场景,NumExpr 往往只需极少代码改动,就能获得可观的性能提升。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询