开放Python语言广泛应用于数据分析和机器学习。但是由于python的底层特性,python运行速度慢的问题一直广受诟病。其中,numpy和pandas的广泛使用使数据处理和机器学习的速度提高了几个档次。但是随着数据越来越多,很多人不再满足于numpy和pandas的速度,从而退出了一批加速优化扩展包。本文主要介绍一个轻量级但功能强大的python扩展包“NumExpr”,看看它是如何高效解析数学公式的。NumExprNumExpr的使用非常简单。只需要将原来的numpy语句用双引号括起来,使用numexpr中的evaluate方法调用即可。第一步:需要引入numexpr和numpy扩展包;importnumexprasneimportnumpyasnp步骤2:创建两个numpy数组-a和b;a和b中包含的数据数量为100万。当我们需要进行简单的加减乘除时,numexpr的效率得到了很好的体现。如上图,通过执行2a+3b,如果直接操作,需要3.39毫秒。但是,如果我们使用ne.evaluate加快速度,我们可以将时间减少到1.55毫秒。numexpr在更复杂的数学表达式运算中表现如何?当我们使用上面显示的数学表达式时,正常执行需要28.3毫秒。并且通过numexpr的加速,只需要3.03ms。注意numexpr可以识别sin函数,所以我们在evaluate中不用写np.sin,直接写sin即可。总结:处理的数据量越大,数学计算越复杂,numexpr的加速效果会越明显。对比numpy和numexpr可以看出,当np.array的元素个数超过10e8时,加速效果更加显着。numexpr还支持逻辑表达式和复杂表达式的加速,感兴趣的读者可以自行对比。numexpr多线程加速numexpr还有一个重要的加速工具,多线程运行。线程数可以通过ne.set_num_threads(1)来设置,线程数多意味着程序可以同时计算数学表达式。如上所示,如果我们设置为单线程,则程序运行需要13.4ms。使用双线程设置,速度可以加倍。numexpr对pandas的加速numexpr的设计主要是针对numpy的。同样,我们知道pandas也是基于numpy开发的。当然,numexpr也可以用来加速pandas。pandas中有一个eval方法,它使用numexpr来优化和加速pandas代码。当我们构建多个pandasdataframes然后对其进行操作时,pd.eval可以将程序从原来的47.4ms加速到17.6ms。总结通过上面的例子,numexpr对于numpy和pandas的加速是非常显着的,尤其是在数据量比较大,计算比较复杂的时候。同时,numexpr的使用非常简单。但是,我们需要注意任何加速工具都会有局限性,并不是所有的作业都可以使用numexpr进行加速。看完别走,还有惊喜!精心整理了2TB的计算机/Python/机器学习/深度学习相关的视频课和书籍,价值1W元。关注微信公众号“计算机与AI”,点击下方菜单获取网盘链接。
