前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >numexpr:你以为 numpy 已经够快了,其实它还可以更快

numexpr:你以为 numpy 已经够快了,其实它还可以更快

作者头像
计算机与AI
发布2020-11-19 14:21:29
发布2020-11-19 14:21:29
1.5K00
代码可运行
举报
文章被收录于专栏:计算机与AI计算机与AI
运行总次数:0
代码可运行

转载自今日头条:https://mp.weixin.qq.com/cgi-bin/appmsg?t=media/appmsg_edit_v2&action=edit&isNew=1&type=10&createType=0&token=2133469070&lang=zh_CN


开篇

python语言被广泛用于数据分析和机器学习。但是,由于python的底层特性,python的运行速率低一直被广泛诟病。其中,numpy和pandas的广泛使用已经将数据处理和机器学习的速率提升了几个档次。

但是,随着数据的越来越多,很多人已经不再满足numpy和pandas的速度,从而退出了一批加速优化拓展包。这篇文章主要介绍一个轻量、但是功能强大的python扩展包 ”NumExpr",看看它是如何高效解析数学公式的。

NumExpr

NumExpr的使用及其简单,只需要将原来的numpy语句使用双引号框起来,并使用numexpr中的evaluate方法调用即可。

第一步:需要引入 numexpr 和 numpy 扩展包;

代码语言:javascript
代码运行次数:0
复制
import numexpr as ne
import numpy as np

第二步:创建两个numpy的array - a 和 b;

a和b两个所包含的数据个数为100万个。

当我们需要执行简单的加减乘除的时候,numexpr的效率已经得到了很好地体现。如上图所示,通过执行 2 * a + 3 * b,如果直接操作,需要3.39 毫秒。但是,如果我们是用ne.evaluate加速,可以将时间缩短至1.55 毫秒。

numexpr在更加复杂的数学表达式运算中,表现到底如何呢?

当我们使用如上所示的数学表达式,正常执行需要28.3 ms。而通过numexpr的加速,只需要3.03 ms。

注意,numexpr是可以识别 sin 函数的,所以我们不需要在evaluate里面写np.sin,可以直接写 sin。

总结:处理数据量越大,数学计算越复杂,则numexpr的加速效果越明显。

numpy 和 numexpr 比较

我们可以看到,当np.array的元素个数超过10e8,加速效果更加显著。

numexpr也支持逻辑表达式和复数表达式的加速,有兴趣的读者朋友可以自行比较。

numexpr 多线程加速

numexpr还有一个重要的加速利器,多线程操作。通过 ne.set_num_threads(1) 可以设置线程的数量,更多的线程表示程序可以同时对数学表达式进行计算。

如上所示,如果我们设置单线程,程序运行需要13.4 ms。设置了双线程,速度则可以提升一倍。

numexpr对pandas的加速

numexpr的设计主要针对的是numpy。同样的,我们知道pandas也是基于numpy开发的。自然,numexpr同样可以被用来对pandas加速。

pandas中有一个eval方法就是运用了numexpr,对pandas代码进行优化加速。

当我们构建几个pandas的dataframe,然后对它们进行运算的时候,pd.eval 可以将程序从原先的47.4 ms 加速到17.6 ms。

总结

通过以上的实例,numexpr对于numpy和pandas的加速是很显著的,尤其当数据量比较大和计算比较复杂的情况下。同时,numexpr的使用非常简单。但是,我们需要注意的是,任何加速工具都会有局限性的,并不是所有的工作都可以使用numexpr进行加速。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-11-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 计算机与AI 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 开篇
  • NumExpr
  • numexpr 多线程加速
  • numexpr对pandas的加速
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档