0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

电子设计 来源: 电子设计 作者: 电子设计 2020-12-14 23:53 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

开篇

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

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

NumExpr

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

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

/`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进行加速。

审核编辑 黄昊宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 机器学习
    +关注

    关注

    66

    文章

    8541

    浏览量

    136236
  • python
    +关注

    关注

    57

    文章

    4858

    浏览量

    89586
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    BNC线束 | 精准传输,让信号更快一步

    通信、测试、工业控制 还是 科研实验, 德索都能为提供值得信赖的 BNC线束解决方案 —— 让信号更稳,让数据更快
    的头像 发表于 11-13 16:59 507次阅读
    BNC线束 | 精准传输,让信号<b class='flag-5'>更快</b>一步

    除了云端,电能质量在线监测装置的数据还可以存储在哪里?

    除了云端,电能质量在线监测装置的数据还可存储在 装置内置存储、外接存储设备、本地服务器 / 数据中心 三类本地存储载体中,不同方式的容量、可靠性、适用场景差异较大,需结合需求(如短期备份、长期集中
    的头像 发表于 10-30 09:48 110次阅读

    为什么开关二极管速度不够快

    在电子电路设计中,二极管不仅用作整流和限幅,还常常作为开关元件应用在高频和高速电路里。此类二极管被称为开关二极管。它们的核心特性是能够快速完成导通与关断,从而不影响电路的工作速度。然而,在实际应用中
    的头像 发表于 09-10 10:01 436次阅读
    为什么开关二极管速度不<b class='flag-5'>够快</b>?

    yolov11转kmodel,numpy是要降级为1.x吗?

    python3.9,yolo是最新的稳定版,和yolo捆绑pip安装的numpy是2.0.1 错误日志
    发表于 08-11 08:16

    全新原装福禄克FLUKE754过程校验仪

    捕获数据。当然,它还可帮助您满足 ISO 9000、FDA、EPA 和 OSHA 法规等多项严格标准。 福禄克 754 记录过程校准仪-HART:更智能。更快捷。 新环境拍照苛刻环境下更易使用 HART
    发表于 07-24 10:45

    生活处处有晶振,正被温柔“控场”

    一个清晨,不知不觉已经依赖了几十颗默默工作的晶振。它们如同精准的隐形齿轮,驱动着我们身边几乎每一件电子设备。石英晶振,这个看似陌生的名字,其实早已融入现代生活的
    的头像 发表于 07-24 09:37 325次阅读
    生活处处有晶振,<b class='flag-5'>你</b>正被温柔“控场”

    粘接聚酰亚胺PI膜除了使用PI膜专用UV胶粘接,还可以使用热固化环氧胶来解决!

    粘接聚酰亚胺PI膜可以使用PI膜专用UV胶粘接,但使用UV胶粘接时,需要粘接材料至少有一方要透UV紫外光方可,如不能透UV光,那么粘接PI这种难于粘接的材料时,还可以使用热固化环氧胶来解决!热固化环
    的头像 发表于 05-07 09:11 1128次阅读
    粘接聚酰亚胺PI膜除了使用PI膜专用UV胶粘接,<b class='flag-5'>还可以</b>使用热固化环氧胶来解决!

    是否可以为RT1060添加HDMI输出?

    是否可以为 RT1060 添加 HDMI 输出?我想支持标准 720p 分辨率并使用图形加速。
    发表于 04-10 08:04

    的树莓派跑不快的5个原因!

    尽管最早的RaspberryPi是作为一种廉价设备设计的,目的是让学生迷上编码,但超级流行的SBC系列在性能和功能方面已经取得了很大进步。现代RPiSBCs配备了更快的内核、充足的内存和更好的I/O
    的头像 发表于 03-27 15:44 1108次阅读
    <b class='flag-5'>你</b>的树莓派跑不快的5个原因!

    慧能泰USB PD3.2 Type-C控制器HUSB368介绍

    在当今智能化时代,快充技术发展迅猛。最开始18W、20W就能让人心动,后来60W、80W都觉得平平无奇,上百瓦才得劲,本以为用上了120W快充就够快了,没想到还是难以满足电动工具、无人机、机器人等新兴场景对48V高电压供电及复杂协议交互的要求。
    的头像 发表于 03-17 17:02 1182次阅读
    慧能泰USB PD3.2 Type-C控制器HUSB368介绍

    速度更快,传输更稳定的工业相机COF接口

    工业相机的数据接口之一COF接口,速度更快,传输更稳定的。
    的头像 发表于 03-10 17:32 867次阅读
    速度<b class='flag-5'>更快</b>,传输更稳定的工业相机COF接口

    DLP3010EVM-LC无法连接3.1.0.3版本的GUI,之前安装2.2.0.6版本的时候还可以连接,为什么呢?

    DLP3010EVM-LC无法连接3.1.0.3版本的GUI,之前安装2.2.0.6版本的时候还可以连接,为什么呢
    发表于 02-24 06:47

    使用micropython的ulab.numpy切片将RGB888的NHWC格式转换为RGBP888的NCHW格式,速度非常慢怎么解决?

    转换代码如下.每次转换需要花费200ms以上. rgb888_img_np = rgb888_img.to_numpy_ref()rgb888p_img_np = np.zeros((3
    发表于 02-08 07:25

    是否还可以使用DS90CR288/287转换成LVDS--TTL/CMOS使用?

    (原始的像素)数据 ,请问是否还可以使用DS90CR288/287转换成LVDS--TTL/CMOS 使用啊 ,项目比较紧迫,否则直接做个小板直接验证了 期待大侠解答
    发表于 01-10 06:15

    振弦采集仪 实现32个通道全自动采集、存储和无线发送功能 多种信号传感器通道扩展

    振弦采集仪 实现32个通道全自动采集、存储和无线发送功能 多种信号传感器通道扩展 VS-Box是一种多通道无线采集和发送仪器,主要用于振弦和温度传感信号。它还可以扩展到其他模拟(电流、电压、电阻
    的头像 发表于 12-31 15:31 675次阅读