Ich arbeite an Code, der mehrere netcdf-Dateien (große ~ 28G) überschleift. Die netcdf-Dateien haben mehrere 4D-Variablen [Zeit, Ost-West, Süd-Nord, Höhe] in einer Domäne. Das Ziel besteht darin, diese Dateien zu durchlaufen und jede Position dieser Variablen in der Domäne zu durchlaufen und bestimmte Variablen zu ziehen, um sie in einem großen Array zu speichern. Wenn fehlende oder unvollständige Dateien vorhanden sind, fülle ich die Werte mit 99.99. Momentan teste ich nur, indem ich täglich zwei netcdf-Dateien durchlaufe, aber aus irgendeinem Grund dauert es ewig (~ 14 Stunden). Ich bin mir nicht sicher, ob es eine Möglichkeit gibt, diesen Code zu optimieren. Ich denke nicht, dass Python für diese Aufgabe so lange braucht, aber vielleicht ist es ein Problem mit Python oder meinem Code. Unten ist mein Code hoffentlich ist es lesbar und Vorschläge, wie diese schneller zu machen ist sehr zu schätzen:Wie kann ich meinen Python-Code schneller laufen lassen?
#Domain to loop over
k_space = np.arange(0,37)
j_space = np.arange(80,170)
i_space = np.arange(200,307)
predictors_wrf=[]
names_wrf=[]
counter = 0
cdate = start_date
while cdate <= end_date:
if cdate.month not in month_keep:
cdate+=inc
continue
yy = cdate.strftime('%Y')
mm = cdate.strftime('%m')
dd = cdate.strftime('%d')
filename = wrf_path+'\wrfoutRED_d01_'+yy+'-'+mm+'-'+dd+'_'+hour_str+'_00_00'
for i in i_space:
for j in j_space:
for k in k_space:
if os.path.isfile(filename):
f = nc.Dataset(filename,'r')
times = f.variables['Times'][1:]
num_lines = times.shape[0]
if num_lines == 144:
u = f.variables['U'][1:,k,j,i]
v = f.variables['V'][1:,k,j,i]
wspd = np.sqrt(u**2.+v**2.)
w = f.variables['W'][1:,k,j,i]
p = f.variables['P'][1:,k,j,i]
t = f.variables['T'][1:,k,j,i]
if num_lines < 144:
print "partial files for WRF: "+ filename
u = np.ones((144,))*99.99
v = np.ones((144,))*99.99
wspd = np.ones((144,))*99.99
w = np.ones((144,))*99.99
p = np.ones((144,))*99.99
t = np.ones((144,))*99.99
else:
u = np.ones((144,))*99.99
v = np.ones((144,))*99.99
wspd = np.ones((144,))*99.99
w = np.ones((144,))*99.99
p = np.ones((144,))*99.99
t = np.ones((144,))*99.99
counter=counter+1
predictors_wrf.append(u)
predictors_wrf.append(v)
predictors_wrf.append(wspd)
predictors_wrf.append(w)
predictors_wrf.append(p)
predictors_wrf.append(t)
u_names = 'u_'+str(k)+'_'+str(j)+'_'+str(i)
v_names = 'v_'+str(k)+'_'+str(j)+'_'+str(i)
wspd_names = 'wspd_'+str(k)+'_'+str(j)+'_'+str(i)
w_names = 'w_'+str(k)+'_'+str(j)+'_'+str(i)
p_names = 'p_'+str(k)+'_'+str(j)+'_'+str(i)
t_names = 't_'+str(k)+'_'+str(j)+'_'+str(i)
names_wrf.append(u_names)
names_wrf.append(v_names)
names_wrf.append(wspd_names)
names_wrf.append(w_names)
names_wrf.append(p_names)
names_wrf.append(t_names)
cdate+=inc
Sie können Multiprocessing verwenden, um die Dateien gleichzeitig zu verarbeiten. ordnen Sie die k, j, i Leerzeichen für verschiedene Prozesse an und lassen Sie jede von ihnen ihre eigene Aufgabe ausführen – haifzhan
Was ist 'nc.Dataset'? Bevor Sie * Geschwindigkeit * verbessern können, müssen Sie außerdem wissen, warum es langsam ist. Sie müssen Ihren Code profilieren und * messen *. –
es ist, wie ich in netcdf-Dateien mit Python lese ich habe eine Aussage früher im Code, der hier nicht gezeigt wird: netCDF4 als nc – HM14