给定一个矩形的两个对角(x1, y1)
and (x2, y2)
和两个半径r1
and r2
,找到位于由半径定义的圆之间的点的比率r1
and r2
到矩形中的点数。
简单的 NumPy 方法:
def func_1(x1,y1,x2,y2,r1,r2,n):
x11,y11 = np.meshgrid(np.linspace(x1,x2,n),np.linspace(y1,y2,n))
z1 = np.sqrt(x11**2+y11**2)
a = np.where((z1>(r1)) & (z1<(r2)))
fill_factor = len(a[0])/(n*n)
return fill_factor
接下来我尝试用以下方法优化这个函数jit
来自 numba 的装饰器。当我使用时:
nopython = True
该函数速度更快并给出正确的输出。但是当我还添加:
parallel = True
该函数速度更快,但给出了错误的结果。
我知道这与我的z
矩阵,因为它没有被正确更新。
@jit(nopython=True,parallel=True)
def func_2(x1,y1,x2,y2,r1,r2,n):
x_ = np.linspace(x1,x2,n)
y_ = np.linspace(y1,y2,n)
z1 = np.zeros((n,n))
for i in range(n):
for j in range(n):
z1[i][j] = np.sqrt((x_[i]*x_[i]+y_[j]*y_[j]))
a = np.where((z1>(r1)) & (z1<(r2)))
fill_factor = len(a[0])/(n*n)
return fill_factor
测试值:
x1 = 1.0
x2 = -1.0
y1 = 1.0
y2 = -1.0
r1 = 0.5
r2 = 0.75
n = 25000
附加信息:Python版本:3.6.1,Numba版本:0.34.0+5.g1762237,NumPy版本:1.13.1