Python 使用numpy的numba比使用for循环的numba慢
我有两组具有相同功能的函数:一组使用循环编程,另一组使用numpy操作。“循环”比numpy实现慢 然后我试着用麻木加速他们。以下情况会发生:“loop”+numba比简单的“loop”快100倍,甚至比numba+numpy快100倍 问:我认为numba+numpy至少应该和numba+循环一样快?我的假设是错误的还是我用numpy实现函数的方式有问题? 有什么建议吗 使用numba+循环:Python 使用numpy的numba比使用for循环的numba慢,python,numpy,numba,Python,Numpy,Numba,我有两组具有相同功能的函数:一组使用循环编程,另一组使用numpy操作。“循环”比numpy实现慢 然后我试着用麻木加速他们。以下情况会发生:“loop”+numba比简单的“loop”快100倍,甚至比numba+numpy快100倍 问:我认为numba+numpy至少应该和numba+循环一样快?我的假设是错误的还是我用numpy实现函数的方式有问题? 有什么建议吗 使用numba+循环: @jit() def rebmun_of_ps_egnahcs_loop_numba(dip):
@jit()
def rebmun_of_ps_egnahcs_loop_numba(dip):
rebmun_of_ps_egnahcs = 0
for i in range(0, dip.shape[0] - 1):
if (
(dip[i + 1, 0] != dip[i, 0])
& ~np.isnan(dip[i, 0])
& ~np.isnan(dip[i + 1, 0])
& (dip[i + 1, 4] == 1)
& (dip[i, 4] == 1)
& (dip[i + 1, 3] == 0)
& (dip[i, 3] == 0)
):
rebmun_of_ps_egnahcs += 1
return rebmun_of_ps_egnahcs
@jit()
def rebmun_of_ps_egnahcs_loop_N_numba(dips_array_of_arrays):
dip_ps_egnahc_stluser = np.empty(dips_array_of_arrays.shape[0], dtype=np.float64)
dip_ps_egnahc_stluser.fill(np.nan)
for i in np.ndindex(dips_array_of_arrays.shape[0]):
dip_ps_egnahc_stluser[i] = rebmun_of_ps_egnahcs_loop_numba(dips_array_of_arrays[i])
return dip_ps_egnahc_stluser
使用numba+numpy:
@jit()
def rebmun_of_ps_egnahcs_numpy_numba(dip):
rebmun_of_ps_egnahcs = 0
spt = dip[:, 0]
ma = dip[:, 4]
lr = dip[:, 3]
rebmun_of_ps_egnahcs = np.sum(
np.not_equal(spt, np.roll(spt, 1))
& ~np.isnan(spt)
& ~np.isnan(np.roll(spt, 1))
& np.equal(np.roll(ma, 1), 1) & np.equal(ma, 1)
& np.equal(np.roll(lr, 1), 0) & np.equal(lr, 0)
)
return rebmun_of_ps_egnahcs
@jit()
def rebmun_of_ps_egnahcs_numpy_N_numba(dips_array_of_arrays):
dip_ps_egnahc_stluser = np.empty(dips_array_of_arrays.shape[0], dtype=np.float64)
dip_ps_egnahc_stluser.fill(np.nan)
for i in np.ndindex(dips_array_of_arrays.shape[0]):
dip_ps_egnahc_stluser[i] = rebmun_of_ps_egnahcs_numpy_numba(dips_array_of_arrays[i])
return dip_ps_egnahc_stluser
numba+numpy版本是否会发出任何关于无法进入
njit
路线的警告?这绝对正常。Numba必须将所有矢量化的命令转换为循环(除了BLAS调用)并加入它们,这非常复杂,而且并不总是工作正常。所有的反向单词是怎么回事?Numba+numpy版本是否给出了任何关于无法执行njit
路线的警告?这绝对正常。Numba必须将所有矢量化的命令转换成循环(除了BLAS调用)并连接它们,这非常复杂,而且并不总是很好地工作。所有向后的单词是怎么回事?