首页 > 解决方案 > python代码的Cython实现——发现阻碍速度提升的主要问题

问题描述

我一直在尝试使用 Cython 来加速代码,其中附加函数是主要的主力。然而,我的结果非常不令人满意:经过非常努力(但很可能不是以聪明的方式)后,我只能将速度提高 5-10%。我觉得我在这里错过了一些基本的东西;请帮忙。

我最初的代码实现使用矩阵指数/幂的特征值分解(我的自定义函数),这给了它一些提升。我想知道在这里这样做是否有益。

@cython.boundscheck(False)
@cython.wraparound(False)
cdef t_routine(float complex[:,:] Uv , float complex [:,:] UBAv , float complex [:,:] UBA1v , float complex [:,:] rhov , int j): #Fixed t routine.
    hda = np.empty(tmax-tmin, dtype = typf) #f = float, #c  = float complex
    cdef float[:] hdv = hda

    cdef int ta,b,a, size = 2*j+1
    cdef float hd, p, q, sum 

    UA = np.linalg.matrix_power(Uv, ta) 
    UA1 = UA.conj().T 
    cdef float complex [:,:] UAv = UA
    cdef float complex [:,:] UA1v = UA1

    UB = sp.matmul(UBAv, UAv)
    UB1 = UB.conj().T
    cdef float complex [:,:] UBv = UB
    cdef float complex [:,:] UB1v = UB1

    rhoA = sp.matmul( sp.matmul(UAv, rhov), UA1v)   #scipy
    rhoB = sp.matmul(sp.matmul(UBv, rhov) , UB1v)   
    cdef float complex [:,:] rhoBv = rhoB 
    cdef float complex [:,:] rhoAv = rhoA

    PB = np.empty(size, dtype=typf)
    PC = np.empty(size, dtype=typf)
    cdef float [:] PBv = PB
    cdef float [:] PCv = PC  

    I = np.identity(size, dtype=typc)
    cdef float complex [:,:] Iv = I 




    for ta in range(tmin, tmax+1):    

        for b in range(size):
            BP = np.outer(Iv[:,b], Iv[b,:])  
            PBv[b] = Prob(BP, rhoBv, size)
            sum = 0
            for a in range(size):
            #   Aket = JZket(j,b)
                AP = np.outer(Iv[:,a], Iv[a,:]) 
                p = Prob(AP, rhoAv, size)
                rhoC = sp.matmul(sp.matmul(UBAv, AP), UBA1v )
                q = Prob(BP, rhoC, size)
                sum = sum+p*q
            PCv[b] = sum
        hd = HD(PBv, PCv)
        hdv[ta] = hd
    return hda

标签: optimizationcython

解决方案


推荐阅读