用于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: | |
Appveyor: | |
PyPi: | |
DOI: | |
readthedocs: |
什么是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。
许可证
numexpr是在MIT许可下分发的。