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

    文章

    8393

    浏览量

    132512
  • python
    +关注

    关注

    56

    文章

    4788

    浏览量

    84563
收藏 人收藏

    评论

    相关推荐

    DAC7718 AVDD供电可以为15V吗?

    想请教下DAC7718的供电可以为15V么?
    发表于 11-19 06:25

    springboot的项目如何既要用jar包启动,同时还可以为不同的机房设置不同的配置文件

    作者:京东科技 李意文 1、首先先把配置文件从jar中抽离 示例代码:   org.apache.maven.plugins maven-jar-plugin 3.2.0 **/spring-xxx.xml   2、把抽离的配置文件,放到conf目录下 利用maven-assembly-plugin,抽取配置文件到conf目录下, 示例代码:   org.apache.maven.plugins maven-assembly-plugin 3.3.0 src/main/assembly/assembly.xml make-assembly package single        assembly.xml内容如下: assembly zip dir false ${basedir}/src/bin bin 0755 ${project.build.directory}/${project.build.finalName}.jar lib ${basedir}/../xxx/target/classe
    的头像 发表于 10-19 16:48 469次阅读
    springboot的项目如何既要用jar包启动,同时<b class='flag-5'>还可以为</b>不同的机房设置不同的配置文件

    请问PGA280的带宽是多少呀,输入信号可以为20kHz吗?

    您好!请问PGA280的带宽是多少呀,输入信号可以为20kHz吗?
    发表于 09-26 06:13

    CyU3PDmaMultiChannelCommitBuffer失败后,如何使重置速度更快

    。 我遇到的问题是,由于缺乏缓冲内存(主机速度不够快,因为它必须同时处理多个 CX3 数据流),CX3 有时会丢弃一些帧。 这是我目前使用的内存映射(我优化了一些数据区域,并使用 2 级引导加载器
    发表于 07-23 08:29

    可以为XMC 1400系列微控制器使用哪种集成开发环境?

    我们可以为 XMC 1400 系列微控制器使用哪种集成开发环境?
    发表于 07-22 07:41

    使用NumPy实现前馈神经网络

    要使用NumPy实现一个前馈神经网络(Feedforward Neural Network),我们需要从基础开始构建,包括初始化网络参数、定义激活函数及其导数、实现前向传播、计算损失函数、以及实现
    的头像 发表于 07-11 16:30 1605次阅读

    SolidWorks科研版更快地开发产品创意

    在当今竞争激烈的市场环境中,产品创新的速度和质量直接决定了企业的生死存亡。对于科研人员和设计师来说,如何能够快速、准确地实现产品创意的转化,是摆在面前的一大挑战。SolidWorks科研版作为一款
    的头像 发表于 06-19 16:49 257次阅读

    直流电充电桩可以为车充100%吗?

    直流充电桩,也称为快速充电站,是为了满足电动汽车快速充电需求而设计的。它们能够直接向电动汽车的电池提供直流电,从而实现比交流充电更快的充电速度。
    的头像 发表于 04-30 15:27 1475次阅读

    python 学习:在内网中 python库-numpy 安装方法,升级pip3版本的指令

    指令格式如下:先下载numpy库到C盘具体位置 手动安装指令如下: pip install c:\\\\users\\\\sesa738142
    发表于 04-22 17:18

    以为的RAM不是以为的RAM~

    一、DTCM和AXI连接的RAMSTM32H7系列处理器内部有多个RAM空间,每个RAM空间的大小和响应速度都不一样。这里面我们重点关注DTCM总线矩阵连接的128KBRAM和AXI总线矩阵连接的512KBRAM。DTCMRAM128KB:MDK配置是IRAM1:起始地址是0x20000000,大小是0x20000,128KBAXIRAM512KB:MDK配
    的头像 发表于 04-05 08:09 1018次阅读
    <b class='flag-5'>你</b><b class='flag-5'>以为</b>的RAM不是<b class='flag-5'>你</b><b class='flag-5'>以为</b>的RAM~

    【开源项目】自制一个创客专属的无反相机

    WiFi,它还可以: 远程控制拍照 连接一些舵机以倾斜角度 甚至成为一个远程机器人... 如果对AI感兴趣,它还可以: 通过语音识别说出拍照命令 通过检测到人物自动拍照 自动对焦人脸 人脸识别并在照片中标记... 有兴趣的小伙
    发表于 02-29 15:50

    为什么GPU比CPU更快

    GPU比CPU更快的原因并行处理能力:GPU可以同时处理多个任务和数据,而CPU通常只能一次处理一项任务。这是因为GPU的架构使得它可以同时处理多个核心,从而实现高效的并行计算,这是GPU在处理
    的头像 发表于 01-26 08:30 2360次阅读
    为什么GPU比CPU<b class='flag-5'>更快</b>?

    基于NumPy的机器学习算法实现

    David Bourgin 表示他一直在慢慢写或收集不同模型与模块的纯 NumPy 实现,它们跑起来可能没那么快,但是模型的具体过程一定足够直观。每当我们想了解模型 API 背后的实现,却又不想看复杂的框架代码,那么它可以作为快速的参考。
    发表于 01-17 12:36 196次阅读
    基于<b class='flag-5'>NumPy</b>的机器学习算法实现

    《Linux常用命令自学手册》+入门Linux的命令,就看这本书保成高手

    专门配置了有常用的参数。 命令带的常用参数做成的表格,非常直观方便,看了这个表格当手册来用,应用起来真方便。 每条命令还可以提供了一些参考事例,能够很快的进行,能够掌握这条命令的内容。 有些命令只是
    发表于 12-23 21:46

    万万没想到,二极管竟然还可以这样用?

    万万没想到,二极管竟然还可以这样用?
    的头像 发表于 12-15 09:28 319次阅读
    万万没想到,二极管竟然<b class='flag-5'>还可以</b>这样用?