Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用numpy的numba比使用for循环的numba慢_Python_Numpy_Numba - Fatal编程技术网

Python 使用numpy的numba比使用for循环的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):

我有两组具有相同功能的函数:一组使用循环编程,另一组使用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

numba+numpy版本是否会发出任何关于无法进入
njit
路线的警告?这绝对正常。Numba必须将所有矢量化的命令转换为循环(除了BLAS调用)并加入它们,这非常复杂,而且并不总是工作正常。所有的反向单词是怎么回事?Numba+numpy版本是否给出了任何关于无法执行
njit
路线的警告?这绝对正常。Numba必须将所有矢量化的命令转换成循环(除了BLAS调用)并连接它们,这非常复杂,而且并不总是很好地工作。所有向后的单词是怎么回事?