2016-12-18 3 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. Во-вторых, у вас три вложенные петли, что обычно плохо. Проверьте, действительно ли вам нужно три? – GurV

+0

Спасибо за предложение. Я буду хранить постоянные значения в качестве переменных. Тем не менее, мне нужны три вложенных цикла – user7269405

ответ

1

В большинстве случаев ваш код обрабатывается вычислением косинуса (не из-за записи в файл). Используйте time для измерения времени, затраченного различными частями вашего кода, как описано here.

Вы можете получить значительное улучшение (~ 10 раз быстрее) путем преобразования в numpy array operations, как показано ниже (непроверенные, пожалуйста, проверьте перед использованием)

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