将matlab代码翻译成python,但python要慢得多

将matlab代码翻译成python,但python要慢得多,python,matlab,translate,Python,Matlab,Translate,所以我最近开始使用python,我正在做一个计算风暴露的项目。我在matlab中管理了我的代码,它运行得非常快(可以在3分钟内完成),但在我将代码翻译成python之后,我得到了相同的结果,但需要3小时才能完成它的工作。我真的需要帮忙检查是什么造成了如此巨大的差异 这是我的python代码。如果有人需要,我可以给出我的matlab代码 from netCDF4 import Dataset, num2date import numpy as np import matplotlib.pyplot

所以我最近开始使用python,我正在做一个计算风暴露的项目。我在matlab中管理了我的代码,它运行得非常快(可以在3分钟内完成),但在我将代码翻译成python之后,我得到了相同的结果,但需要3小时才能完成它的工作。我真的需要帮忙检查是什么造成了如此巨大的差异

这是我的python代码。如果有人需要,我可以给出我的matlab代码

from netCDF4 import Dataset, num2date
import numpy as np
import matplotlib.pyplot as plt
from scipy import interpolate
#import pylab as py
#input data
dem = Dataset('comparearea_fill.nc','r')
lon = np.array(dem.variables['lon'])
lat = np.array(dem.variables['lat'])
DEM = np.array(dem.variables['elevation'])
carea = Dataset('carea.nc','r')
u = np.array(carea.variables['u10'])
v = np.array(carea.variables['v10'])
mu = np.mean(u, axis=0)
mv = np.mean(v, axis=0)
x = np.linspace(1,21,21)
y = np.linspace(1,11,11)

newu = interpolate.interp2d(x, y, mu, kind='cubic')
newv = interpolate.interp2d(x, y, mv, kind='cubic')

spu = newu(lon,lat)
spv = newv(lon,lat)

A = np.zeros((4951,9451))
B = np.zeros((4951,9451))
for i in range(100,4850):
    for j in range(100,9350):
        for n in range(20):
            A[i,j] = (DEM[i,j]-np.max(DEM[np.floor(n*spv[i,j]).astype(int),j-np.floor(n*spu[i,j]).astype(int)]))/DEM[i,j]
            if  A[i,j] < 0:
                A[i,j] = 0
            B[i,j] = (DEM[i,j]-np.max(DEM[i-np.ceil(n*spv[i,j]).astype(int),j-np.ceil(n*spu[i,j]).astype(int)]))/DEM[i,j]
            if B[i,j] < 0:
               B[i,j] = 0

C = A+B
plt.contourf(lon,lat,C); plt.colorbar()
来自netCDF4导入数据集,num2date
将numpy作为np导入
将matplotlib.pyplot作为plt导入
从scipy导入插值
#将pylab作为py导入
#输入数据
dem=数据集('comparearea\u fill.nc','r')
lon=np.array(dem.variables['lon'])
lat=np.数组(dem.变量['lat'])
DEM=np.array(DEM.variables['elevation']))
carea=数据集('carea.nc','r')
u=np.array(carea.variables['u10'])
v=np.array(carea.variables['v10'])
mu=np.平均值(u,轴=0)
mv=np.平均值(v,轴=0)
x=np.linspace(1,21,21)
y=np.linspace(1,11,11)
newu=interpolate.interp2d(x,y,mu,kind='cubic')
newv=interpolate.interp2d(x,y,mv,kind='cubic')
spu=newu(长、宽)
spv=新值(lon,lat)
A=np.零((49519451))
B=np.零((49519451))
对于范围内的i(1004850):
对于范围内的j(1009350):
对于范围(20)内的n:
A[i,j]=(DEM[i,j]-np.max(DEM[np.floor(n*spv[i,j]).astype(int),j-np.floor(n*spu[i,j]).astype(int)])/DEM[i,j]
如果A[i,j]<0:
A[i,j]=0
B[i,j]=(DEM[i,j]-np.max(DEM[i-np.ceil(n*spv[i,j]).astype(int),j-np.ceil(n*spu[i,j]).astype(int)])/DEM[i,j]
如果B[i,j]<0:
B[i,j]=0
C=A+B
轮廓曲线图(长、宽、C);plt.colorbar()

这里mu和mv是u和v风的月平均值,而spu和spv是样条插值u和v风,以适合我的dem数据集的分辨率

这是因为您使用的是大for循环inside for循环inside for循环。如果你想编写这样的代码,可以使用C++或C扩展名(或)NUBA。简单地使用另一种语言不会使代码运行得更快,您必须用该语言编写优化的代码。许多numpy函数都是矢量化的,因此使用所有这些嵌套for循环会严重影响性能为什么要在
n
上进行循环?您没有使用值
n=0..18
。有许多类似的帖子:,,等等。有什么新消息?MATLAB有一个JIT,Python(默认情况下)没有,因此速度会慢一些。