optimization - 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
解决方案
推荐阅读
- angular - 使用 webpack 在运行时将环境配置注入 Angular 应用程序?
- python-3.x - 如何比较两个电子表格以识别缺失的行项目并添加它们?
- python - 如何在django的一个函数中接收两个或多个表单
- c# - 如何在页脚gridview c#中添加信息总页数和行数
- jekyll - 是否可以向安装了 Progressive Web App 的用户发送通知
- javascript - 如何创建包含具有可变输入的函数的变量
- node.js - 没有路径的 createReadStream
- elasticsearch - 策展人没有删除索引
- javascript - 改变 JSON 的结构
- html - 输入类型搜索 - 如何获得白色的占位符和清除按钮?