如何有效地表达以下内容numexpr?
z = min(x-y, 1.0) / (x+y)
Run Code Online (Sandbox Code Playgroud)
在这里,x与y具有相同的形状的一些大型NumPy的阵列.
换句话说,我想盖x-y到1.0除以之前x+y.
我想使用单个numexpr表达式来做这个(x并且y很大,我不想不止一次迭代它们).
我想知道是否有人知道长尾小鹦鹉和Numba jit之间的一些关键区别?我很好奇,因为我正在比较Numexpr与Numba和长尾小鹦鹉,以及这个特殊的表达式(我希望它在Numexpr上表现得非常好,因为它是文档中提到的那个)
结果是

和我测试的功能(通过timeit - 每个功能最少3次重复和10次循环)
import numpy as np
import numexpr as ne
from numba import jit as numba_jit
from parakeet import jit as para_jit
def numpy_complex_expr(A, B):
return(A*B-4.1*A > 2.5*B)
def numexpr_complex_expr(A, B):
return ne.evaluate('A*B-4.1*A > 2.5*B')
@numba_jit
def numba_complex_expr(A, B):
return A*B-4.1*A > 2.5*B
@para_jit
def parakeet_complex_expr(A, B):
return A*B-4.1*A > 2.5*B
Run Code Online (Sandbox Code Playgroud)
如果你想仔细检查机器上的结果,我也可以抓住IPython nb.
如果有人想知道Numba是否安装正确......我是这么认为的,它在我以前的基准测试中表现如预期:

我一直在尝试优化一段涉及大型多维数组计算的python代码.我对numba的结果有违反直觉.我正在运行MBP,2015年中期,2.5 GHz i7 quadcore,OS 10.10.5,python 2.7.11.考虑以下:
import numpy as np
from numba import jit, vectorize, guvectorize
import numexpr as ne
import timeit
def add_two_2ds_naive(A,B,res):
for i in range(A.shape[0]):
for j in range(B.shape[1]):
res[i,j] = A[i,j]+B[i,j]
@jit
def add_two_2ds_jit(A,B,res):
for i in range(A.shape[0]):
for j in range(B.shape[1]):
res[i,j] = A[i,j]+B[i,j]
@guvectorize(['float64[:,:],float64[:,:],float64[:,:]'],
'(n,m),(n,m)->(n,m)',target='cpu')
def add_two_2ds_cpu(A,B,res):
for i in range(A.shape[0]):
for j in range(B.shape[1]):
res[i,j] = A[i,j]+B[i,j]
@guvectorize(['(float64[:,:],float64[:,:],float64[:,:])'],
'(n,m),(n,m)->(n,m)',target='parallel')
def add_two_2ds_parallel(A,B,res):
for i in range(A.shape[0]):
for j in range(B.shape[1]):
res[i,j] = A[i,j]+B[i,j]
def …Run Code Online (Sandbox Code Playgroud) 由于 NumPy 不使用多核,我正在学习使用 NumExpr 加速 NumPy 代码,因为它对多线程有很好的支持。以下是我正在使用的示例:
# input array to work with
x = np.linspace(-1, 1, 1e7)
# a cubic polynomial expr
cubic_poly = 0.25*x**3 + 0.75*x**2 + 1.5*x - 2
%timeit -n 10 cubic_poly = 0.25*x**3 + 0.75*x**2 + 1.5*x - 2
# 657 ms ± 5.04 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
Run Code Online (Sandbox Code Playgroud)
现在,我们可以使用 NumExpr 做同样的事情:
cubic_poly_str = "0.25*x**3 + 0.75*x**2 + 1.5*x - 2"
# set number of threads to …Run Code Online (Sandbox Code Playgroud)