【深度好文】Python加速库NumExpr简介

在这里插入图片描述

1. NumExpr是什么?

NumExpr是一个用于numpy类型快速数值表达式计算的第三方Python加速库。有了它, 在数组上操作的表达式(如3xa+4xb)相比在python中执行速度更快,所需内存空间占用更少。
值得一提的是,NumExpr集成了intel的vml(向量数学计算库 vectore math library)技术, 这使得数值型表达式的计算速度得到了进一步提升。

2. Numexpr如何实现高性能?

NumExpr获得比numpy更好的性能的主要原因是避免为中间结果分配内存,这样可以提高缓存利用率,减少内存访问。因此,NumExpr在处理大型数组时相比numpy效果最好。

3. 如何安装NumExpr?

我们可以通过conda或者pip来进行安装,命令如下:

$ conda install -c anaconda numexpr

或者

pip install numexpr

4. 性能评估

我们计算由两个向量a,b 组成的表达式 f 为例,来评估输入不同大小的两个向量下使用NumExpr和Numpy二者的性能差异。其中f表达式如下:

在这里插入图片描述

1)导入相关库

import numexpr as ne
from time import time

2)使用Numpy来实现

def timeIt_numpy(a, b, runs, loops):
    output = np.zeros(runs)
    for r in range(runs):
        to = time()
        for _ in range(loops):
            current = 2*a**3 + 3*b**2
        ti = time()
        output[r] = ti - to
    return output

上述代码实现了利用Numpy来计算表达式f的功能,其中:
a,b 代表输入的两个向量
runs 代表我们做几次对比实验
loops 代表每次实验表达式重复执行多少次,以方便我们统计时间
output 代表每次实验(即上述表达式执行loops次)所耗费的时间

3)使用NumExpr来实现

def timeIt_numexpr(a, b, runs, loops):
    output = np.zeros(runs)
    for r in range(runs):
        to = time()
        for _ in range(loops):
            current = ne.evaluate('2*a**3 + 3*b**2')
        ti = time()
        output[r] = ti - to
    return output

上述代码实现了利用NumExpr来计算表达式f的功能,相关参数含义同上。这里需要注意的是,使用NumExpr来计算表达式的值,只需要将表达式写成:

current = ne.evaluate('2*a**3 + 3*b**2')

形式即可,对程序的修改及其简单。

4)主函数

这里为了直观对比输入不同size下的vector,统计两者的时间差异,使用matplotlib来画图显示,代码如下:

import matplotlib.pyplot as plt
fig, ax = plt.subplots(1, 1, figsize=(16, 8))

N = 16
runs = 10
loops = 1000
time_numpy = np.zeros((runs, N))
time_numexpr = np.zeros((runs, N))

# Time
for i in range(N):
    a = np.random.rand(2**(i + 1))
    b = np.random.rand(2**(i + 1))
    time_numpy[:,i] = timeIt_numpy(a, b, runs, loops)
    time_numexpr[:,i] = timeIt_numexpr(a, b, runs, loops)

# Plot
x = np.arange(N)
mu = np.mean(time_numpy, axis=0)
ax.plot(mu, label="NumPy")

x = np.arange(N)
mu = np.mean(time_numexpr, axis=0)
ax.plot(mu, label="NumExpr")

ax.set_xlabel('N')
ax.set_xticks(x)
ax.set_xticklabels([f'$2^{{{e + 1}}}$'for e in range(N)])
ax.set_ylabel('time in seconds for each run')

ax.set_title(f'runs = {runs} | loops = {loops}')
ax.legend()
plt.show()

代码含义如下:
N 代表一共输入16组不同大小size的向量,每次实验输入向量的size为[2^1, 2^2 … 2^16]
runs 代表每组向量,进行10次实验
loops 代表表达式执行1000次,方便我们统计表达式执行耗时

耗时对比

在这里插入图片描述
上述图像中,横坐标表示输入向量的size,纵坐标表示向量size为N时,执行10次实验的平均耗时,每次实验中表达式执行1000次。
通过上述曲线,我们可以看出:

  • 当输入向量size小于2^12时,使用Numpy和NumExpr,所耗费的时间相差不大
  • 当size大于 2^12时,随着size的增大,NumExpr的加速效果越来越明显。
  • 当size等于2^16时,NumExpr加速效果​超过了10倍。

5. 总结

在代码中使用NumExpr的好处:

  • 对程序的修改简单,当输入尺度较大时,对支持的表达式的提速效果明显
  • 自动化的多线程;

6. 参考


参考 链接一 链接二



关注公众号《AI算法之道》,获取更多AI算法资讯。

在这里插入图片描述

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
Python深度学习是一种用于实现和应用深度学习算法的软件工具。它提供了各种功能和工具,使得开发者可以更加方便地构建、训练和部署深度学习模型。 Python深度学习的一个重要特点是其功能强大且易于使用。它提供了丰富的神经网络模型,包括常用的卷积神经网络、循环神经网络和自编码器等。这些模型可以通过简洁的接口快速构建,从而加快了算法的开发速度。 此外,Python深度学习还提供了丰富的工具和函数,用于数据预处理、特征工程和模型评估等。例如,它可以对数据进行归一化、标准化和独热编码等操作,以提高模型的训练效果。同时,它还提供了多种损失函数、优化算法和评估指标,用于训练和优化深度学习模型。 另外,Python深度学习还支持并行计算和分布式训练,以加速模型的训练过程。它可以利用图形处理器(GPUs)或分布式计算框架来进行计算,从而提高了深度学习算法的效率和性能。 最后,Python深度学习还有一个不可忽视的优点是其丰富的生态系统。它有着庞大的社区和活跃的开发者,提供了大量的教程、文档和示例代码,为开发者提供了宝贵的学习资源和技术支持。 总而言之,Python深度学习是一种功能强大且易于使用的软件工具,可以帮助开发者更加高效地构建和应用深度学习模型。它的丰富功能和充分的生态系统使得它成为了深度学习领域中不可或缺的利器。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赵卓不凡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值