我正逐漸從Matlab轉向Python,並希望得到一些優化迭代循環的建議。 這就是我目前正在運行的循環,並且我已經包含了定義變量的代碼。優化迭代循環
nh = 2000
h = np.array(range(nh))
nt = 10000
wmin = 1
wmax = 10
hw = np.array(wmin + (wmax-wmin)*invlogit(randn(1,nh)));
sl = np.array(zeros((nh,1))+radians(40))
fa = np.array(zeros((nh,1))+radians(35))
c = np.array(zeros((nh,1))+4.4)
y = np.array(zeros((nh,1))+17.6)
yw = np.array(zeros((nh,1))+9.81)
ir = 0.028
m = np.array(zeros((nh,nt)));
m[:,49] = 0.1
z = np.array(zeros((nh,nt)))
z[:,0] = 0+(3.0773-0)*rand(nh,1).T
reset = np.array(zeros((nh,nt)))
fs = np.array(zeros((nh,nt)))
for t in xrange(0, nt-1):
fs[:,t] = (c.T+(y.T-m[:,t]*yw.T)*z[:,t]*(np.cos(sl.T)**2)*np.tan(fa.T))/(y.T*z[:,t]*np.sin(sl.T)*np.cos(sl.T))
reset[fs[:,t]<=1,t+1] = 1;
z[fs[:,t]<=1,t+1] = 0;
z[fs[:,t]>1,t+1] = z[fs[:,t]>1,t]+(ir/hw[0,fs[:,t]>1]).T
這是我會怎樣優化在Matlab代碼,但它運行很慢的蟒蛇。我懷疑這樣做會有更多pythonic的方式,並會真正感謝在正確的方向推動。 非常感謝!
有沒有一種方法可以讓你找出其在循環中的4個操作是最耗時?這可能有助於我們確定需要最多幫助的位置(我可能會猜測它是第一個...... trig函數非常慢)。 – SethMMorton
我還注意到,您正以比C存儲更適合Fortran存儲的方式編制數組索引。您可能會考慮讓numpy將您的陣列存儲在Fortran中。 – SethMMorton
感謝Seth,Fortran命令加快了一點。對於信息/例如,這可以使用z = np.zeros((nh,nt),order ='F')來完成 – user2448817