用于numpy的快速数值表达式求值器

numexpr的Python项目详细描述


Author:David M. Cooke, Francesc Alted and others
Contact:faltet@gmail.com
URL:https://github.com/pydata/numexpr
Documentation:http://numexpr.readthedocs.io/en/latest/
Travis CI:travis
Appveyor:appveyor
PyPi:version
DOI:doi
readthedocs:docs

什么是Numexpr?

numexpr是一个用于numpy的快速数值表达式求值器。有了它, 在数组上操作的表达式(如'3*a+4*b')会加速 使用的内存比在python中执行相同的计算要少。

此外,它的多线程功能可以利用 核心——这通常会导致与 去努比。

最后但并非最不重要的是,numexpr可以利用intel的vml(vector math 库,通常集成在其数学内核库(或mkl)中。 这允许超越表达式的进一步加速。

Numexpr如何实现高性能

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

numexpr将表达式解析为自己的操作码,然后由 集成计算虚拟机。数组操作数被拆分 分成小块,很容易放在CPU的缓存中,并通过 到虚拟机。然后,虚拟机应用 对每个块的操作。值得注意的是 表达式中的常量也被分块。块分布在 CPU的可用内核,产生高度并行化的代码 执行。

结果是,numexpr可以充分利用您的机器计算 数组计算能力。关于 to numpy通常在0.95x之间(对于非常简单的表达式,如 'a + 1')和4x(对于像'a*b-4.1*a > 2.5*b'这样相对复杂的函数),尽管对于某些函数可以实现更高的速度 以及复杂的数学运算(在某些情况下可达15倍)。

numexpr对太大而无法放入l1 cpu缓存的矩阵执行得最好。 为了更好地了解可以实现的不同提速 在您的平台上,运行提供的基准。

用法

>>> import numpy as np
>>> import numexpr as ne

>>> a = np.arange(1e6)   # Choose large arrays for better speedups
>>> b = np.arange(1e6)

>>> ne.evaluate("a + 1")   # a simple expression
array([  1.00000000e+00,   2.00000000e+00,   3.00000000e+00, ...,
         9.99998000e+05,   9.99999000e+05,   1.00000000e+06])

>>> ne.evaluate('a*b-4.1*a > 2.5*b')   # a more complex one
array([False, False, False, ...,  True,  True,  True], dtype=bool)

>>> ne.evaluate("sin(a) + arcsinh(a/b)")   # you can also use functions
array([        NaN,  1.72284457,  1.79067101, ...,  1.09567006,
        0.17523598, -0.09597844])

>>> s = np.array(['abba', 'abbb', 'abbcdef'])
>>> ne.evaluate("'abba' == s")   # string arrays are supported too
array([ True, False, False], dtype=bool)

文档

请参阅numexpr.readthedocs.io上的官方文档。 其中包括用户指南、基准测试结果和参考api。

作者

请看AUTHORS.txt

许可证

numexpr是在MIT许可下分发的。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
Java算法:如何对实体进行分组   C语言中的Java X509EncodedKeySpec#   如何修复java lambda筛选器(缺少返回语句)与future   java有没有办法在Swing中以亚像素精度绘制线条?   HV000030:找不到约束“javax”的验证器。验证。限制。大小为“验证类型”的java。util。可选<java。lang.String>'   CQL中语句的java分页状态   在开发时使用applet查看器的java对象相关applet   java如何从Oracle获取时区ID而不是时区偏移量   java递增变量   java JavaFX InvalizationListener或ChangeListener   java使用多个数据包将大量XMP数据插入jpg?   java允许删除请求   java为什么与类同名的方法不需要返回类型?   java数据转换错误转换   java一旦布尔值为真,如何关闭JFrame?   如何将数据写入两个java。木卫一。一次输出流对象?   mysql如何使用java在SQL中划分两列?   java使用Saxon/XQuery设置URI或目录解析器   mysql java。sql。SQLException:无法将值“20200816 17:33:21.690”从第18列转换为时间戳