Cómo mejorar el rendimiento al interpolar en datos 3D con SciPy

Tengo datos 3D que representan la atmósfera. Ahora quiero interpolar estos datos a una coordenada Z común (lo que quiero decir con esto debería quedar claro en la doctrine de la función). El siguiente código funciona bien, pero me preguntaba si habría alguna manera de mejorar el rendimiento …

def interpLevel(grid,value,data,interp='linear'): """ Interpolate 3d data to a common z coordinate. Can be used to calculate the wind/pv/whatsoever values for a common potential temperature / pressure level. grid : numpy.ndarray The grid. For example the potential temperature values for the whole 3d grid. value : float The common value in the grid, to which the data shall be interpolated. For example, 350.0 data : numpy.ndarray The data which shall be interpolated. For example, the PV values for the whole 3d grid. kind : str This indicates which kind of interpolation will be done. It is directly passed on to scipy.interpolate.interp1d(). returs : numpy.ndarray A 2d array containing the *data* values at *value*. """ ret = np.zeros_like(data[0,:,:]) # we need to copy the grid to a new one, because otherwise the flipping # done below will be messed up gr = np.zeros_like(grid) da = np.zeros_like(data) for latIdx in xrange(grid.shape[1]): for lonIdx in xrange(grid.shape[2]): # check if we need to flip the column if grid[0,latIdx,lonIdx] > grid[-1,latIdx,lonIdx]: gr[:,latIdx,lonIdx] = grid[::-1,latIdx,lonIdx] da[:,latIdx,lonIdx] = data[::-1,latIdx,lonIdx] else: gr[:,latIdx,lonIdx] = grid[:,latIdx,lonIdx] da[:,latIdx,lonIdx] = data[:,latIdx,lonIdx] f = interpolate.interp1d(gr[:,latIdx,lonIdx], \ da[:,latIdx,lonIdx], \ kind=interp) ret[latIdx,lonIdx] = f(value) return ret 

Bueno, esto podría dar una pequeña aceleración solo porque usa menos memoria.

 ret = np.zeros_like(data[0,:,:]) for latIdx in xrange(grid.shape[1]): for lonIdx in xrange(grid.shape[2]): # check if we need to flip the column if grid[0,latIdx,lonIdx] > grid[-1,latIdx,lonIdx]: ind = -1 else: ind = 1 f = interpolate.interp1d(grid[::ind,latIdx,lonIdx], \ data[::ind,latIdx,lonIdx], \ kind=interp) ret[latIdx,lonIdx] = f(value) return ret 

Todo lo que he hecho es deshacerme de gr y da realmente.

Aparte de eso, ¿está llamando a esta función con una gran cantidad de valores diferentes (es decir, el valor es diferente pero otros parámetros son los mismos)? Si es así, es posible que desee que la función sea capaz de manejar múltiples valores (agregue otra dimensión a ret en otras palabras que sea tan larga como la longitud de los valores). Entonces estás haciendo un mejor uso de la función de interpolación que has creado.

La última sugerencia es probar un perfilador . Te permitirá ver lo que está tomando más tiempo.