使用numpy的numba比使用for循环的numba慢

2024-09-28 21:55:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两组具有相同功能的函数:一组使用循环编程,另一组使用numpy操作。“循环”比numpy实现慢

然后我试着用麻木加速他们。以下情况会发生:“loop”+numba比简单的“loop”快100倍,甚至比numba+numpy快100倍

问:我认为numba+numpy至少应该和numba+循环一样快?我的假设是错误的还是我用numpy实现函数的方式有问题? 有什么建议吗

使用numba+循环:

@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

Tags: ofnumpyloopnparraypsshapearrays