python快速递归的方法_递归方程的高效python方法

博客探讨了在代码中优化循环以提高性能的问题。作者比较了两种不同的实现方式,原始循环和使用numpy函数,发现原始循环在某些情况下提供了更好的性能。文章详细展示了代码优化的过程,并展示了一个更复杂的优化函数,该函数涉及矩阵运算和条件判断,以求得进一步的性能提升。
摘要由CSDN通过智能技术生成

我正在尝试优化我在一段代码中的循环.我认为以更加坎坷的方式编写它会使它更快,但现在变慢了!

方程式将n长度为numpy.array的vec作为输入:

from numpy import *

def f(vec):

n=len(vec)

aux=0

for i in range(n):

aux = aux + (1- aux)*vec[i]

return aux

def f2(vec):

n=len(vec)

G=tril(array([-vec]*n),-1)+1 #numpy way!

aux=dot(G.prod(1),vec)

return aux

if __name__ == '__main__':

import timeit

print(timeit.timeit("f(ones(225)+4)", setup="from __main__ import f\nfrom numpy import ones",number=1000))

print(timeit.timeit("f2(ones(225)+4)", setup="from __main__ import f2\nfrom numpy import ones,tril,dot",number=1000))

0.429496049881 [s]

5.66514706612 [s]

最后我决定在我的循环中插入整个函数,获得3倍的性能提升.我真的在寻求100倍的性能提升,但不知道还能做些什么.这是我的最终功能:

def CALC_PROB_LOC2(int nSectors, int nZones,double[:] beta, double[:] thetaLoc,np.ndarray[double, ndim=2] h, np.ndarray[double, ndim=2] p, np.ndarray[np.float64_t, ndim=3] U_nij, np.ndarray[double, ndim=2] A_ni):

cdef np.ndarray[double, ndim=3] Pr_nij =np.zeros((nSectors,nZones,nZones),dtype="d")

cdef np.ndarray[double, ndim=2] U_ni =np.zeros((nSectors,nZones),dtype="d")

#cdef np.ndarray[np.float64_t, ndim=1] A_ni_pos

cdef Py_ssize_t n,i,opt

cdef int aux_bool,options

cdef np.ndarray[np.float64_t, ndim=1] prob,attractor,optionCosts

cdef np.ndarray[np.float64_t, ndim=1] eq23,utilities

cdef double disu

cdef double eq22

cdef double aux17

for n in range(nSectors):

aux_bool=1

if n in [0,2,9,10,11,12,13,14,18,19,20]:

for i in xrange(nZones):

U_ni[n,i]=p[n,i]+h[n,i]

Pr_nij[n,i,i]=1

aux_bool=0

if aux_bool==1:

if beta[n]<=0:

for i in xrange(nZones):

U_ni[n,i]=U_nij[n,i,i]

else:

A_ni_pos=A_ni[n,:]>0

options=len(A_ni[n,:][A_ni_pos])

attractor=A_ni[n,:][A_ni_pos]

if options>0:

for i in xrange(nZones):

optionCosts=U_nij[n,i,A_ni_pos]

disu=0

eq22=0

aux17=0

prob=np.ones(options)/options #default value

if beta[n]==0:

Pr_nij[n,i,A_ni_pos],U_ni[n,i]= prob,0

if options==1:

Pr_nij[n,i,A_ni_pos],U_ni[n,i]= prob,optionCosts

else:

if thetaLoc[n]<=0:

cmin=1

else:

cmin=(optionCosts**thetaLoc[n]).min()

if cmin==0:

cmin=100

utilities=optionCosts/cmin

eq23=-beta[n]*utilities

eq23=np.exp(eq23)

aux17=np.dot(attractor,eq23)

if aux17==0:

Pr_nij[n,i,A_ni_pos],U_ni[n,i]= 0*prob,0

else:

for opt in range(options):

eq22=eq22+(1-eq22)*eq23[opt]

prob=attractor*eq23/aux17

disu=cmin*(-np.log(eq22)/beta[n])

Pr_nij[n,i,A_ni_pos],U_ni[n,i]= prob,disu

return Pr_nij,U_ni

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值