2016-12-18 10 views
0

私のコードの実行時間を改善したいと思います。現在、私は追加モードでテキストファイルを開いてファイルの最後に値を書き込んだ後、ループするたびにファイルを閉じるので、非常に遅いです。誰かが私のすべてのデータをPythonデータ構造体に格納して、結果を同じフォーマットで出力するのを手伝ってもらえますか(つまり、各値をスペースで区切ったテキストファイルのすべての結果)?私はPythonには新しく、実際にこれを実装する方法を理解していません。私のコードは次のとおりです。Pythonデータ構造で実行時間を改善する

######import required packages######## 
import numpy 
import math 

#######Set working directory########## 
import os 
os.chdir('/Users/DevEnv/') 

######Remove files generated from previous simulations##### 
try: 
    os.remove('excitations.txt') 
except OSError: 
    pass 

##############Set Model Parameters##################### 
n=2 #number of iterations -Change for desired number of loops 

tlength=1501 #Length of time interval - DO NOT CHANGE 

wu=100 #DO NOT CHANGE 

N=250 #wu*T/4Pi approximately - DO NOT CHANGE 

Pi=math.radians(180) 
t=numpy.linspace(0,10,tlength) 
Dw=wu/float(N) 


for k in range(0,n): 

    A=[] 

    wi=[] 
    for i in range (0,N): 
     wi.append(Dw/2+i*Dw) #Middle of distribution 
    for j in range (0,tlength): 
     Aj=[] 
     phi=numpy.random.rand(N,1)*2*Pi #Generate random phase angle on 0,2pi 
     for i in range (0,N): 
      w=wi[i] 
      Sv=(((1+4*0.6**2*(w/15)**2)/((1-(w/15)**2)**2+4*0.6**2*(w/15)**2))*(0.0000753*(w/1.5)**4/((1-(w/1.5)**2)**2+4*0.6**2*(w/1.5)**2))) 
      Aj.append(math.sqrt(Sv*Dw)*2*math.cos(wi[i]*t[j]+phi[i])) 
     A.append(sum(Aj)) 
    outFile = open('excitations.txt','a') #open/create the output file 
    for item in A: 
     outFile.write('%s ' %item) 
    outFile.write('\n') 
    outFile.close() #close the output file 
+1

あなたが一定である計算結果を保存することができますまず第一に。例えば、4 * 0.6 ** 2。次に、通常は悪い3つのネストされたループがあります。本当に3つが必要かどうか確認してください。 – GurV

+0

提案していただきありがとうございます。私は変数として定数値を保存します。しかし、私は3つのネストされたループが必要です – user7269405

答えて

1

コード内のほとんどの時間は、余弦計算(ファイルへの書き込みによるものではありません)によって行われます。 timeを使用して、hereと記述されているコードの異なる部分の所要時間を測定します。

あなたは以下のようにnumpy array operationsに変換することにより、大幅に改善(〜10倍の速さ)を取得することができます(未テスト使用前にご確認下さい)

for k in range(0,n): 

    A=[] 

    wi=[] 
    for i in range (0,N): 
     wi.append(Dw/2+i*Dw) #Middle of distribution 

    # convert wi to numpy array as that allows array operations 
    wi_np = numpy.array(wi) 

    # Sv calculation does not change with j so moving it outside the loop 
    # also instead of looping over i to calculate each element 
    # use numpy's array operations over wi_np 
    p1 = (wi_np/15)**2 
    p2 = p1 * 100 # => (wi_np/1.5) ** 2 
    arg1 = (1 + 4 * 0.6**2 * p1)/((1 - p1)**2 + 4 * 0.6**2 * p1) 
    arg2 = 0.0000753 * p2**2/((1 - p2)**2 + 4 * 0.6**2 * p2) 
    Sv_np = arg1 * arg2 

    # amp is an array of size N 
    amp = numpy.sqrt(Sv_np * Dw) 

    for j in range (0,tlength): 
     # changing the dimensions from (N, 1) to N 
     # so that phi is an array of scalars 
     # otherwise it messes up the array operations 
     phi = numpy.random.rand(N) * 2 * Pi 

     # angle is an array of size N 
     angle = wi_np * t[j] + phi 

     # numpy cos is faster than math.cos 
     # the multiplication operator between numpy arrays is element wise 
     # hence Aj_np is also array of size N 
     Aj_np = 2 * amp * numpy.cos(angle) 
     A.append(sum(Aj_np)) 

    outFile = open('excitations.txt','a') #open/create the output file 
    for item in A: 
     outFile.write('%s ' %item) 
    outFile.write('\n') 
    outFile.close() #close the output file 
+0

優秀、これは非常に助けです!どうもありがとうございました :) – user7269405

関連する問題