Python 为什么对于CDF文件来说,从NumPY阵列读取速度如此之慢

Python 为什么对于CDF文件来说,从NumPY阵列读取速度如此之慢,python,numpy,numpy-ndarray,python-iris,Python,Numpy,Numpy Ndarray,Python Iris,我有一个简单的netCDF文件,它有一个数据立方体,即LAT、LONG、TIME和3维,它存储温度。它以蒙蔽数组的形式存储在NumPy中。下面的代码将其提取为CSV格式。但处理20MB文件的速度非常慢,即每次迭代需要20秒,因此我总共有4*548*20秒=43840秒=703分钟=12小时 若你们看有注释的行需要很长的时间,它需要更多的时间。我相信在NumPy中,每个单元都有一个从Python到C代码的转换。不确定在下面的场景中如何解决。请告知。谢谢 #conda安装-y-c conda for

我有一个简单的netCDF文件,它有一个数据立方体,即LAT、LONG、TIME和3维,它存储温度。它以蒙蔽数组的形式存储在NumPy中。下面的代码将其提取为CSV格式。但处理20MB文件的速度非常慢,即每次迭代需要20秒,因此我总共有4*548*20秒=43840秒=703分钟=12小时

若你们看有注释的行需要很长的时间,它需要更多的时间。我相信在NumPy中,每个单元都有一个从Python到C代码的转换。不确定在下面的场景中如何解决。请告知。谢谢

#conda安装-y-c conda forge iris
进口虹膜
将cf_单位作为单位导入
将numpy作为np导入
导入日期时间
导入urllib.request
从操作系统导入路径
def make_data_object_name(数据集名称、年、月、日、小时、实现、预测期):
template_string=“prods_op{}{:02d}{:02d}{:02d}{:02d}}{:02d}{:02d}}{:02d}{:03d}.nc”
返回模板\u string.format(数据集\u名称、年、月、日、小时、实现、预测\u期间)
def下载数据对象(数据集名称、数据对象名称):
url=”https://s3.eu-west-2.amazonaws.com/“+数据集\u名称+”/“+数据对象\u名称”
urllib.request.urlretrieve(url,数据对象名称)#使用相同的名称保存在此目录中
def load_data():
文件名='prods_op_mogreps-uk_20140101_03_02_003.nc'
如果路径不存在(文件名):
#obj_名称=制造_数据_对象_名称('mogreps-uk',2014,1,1,3,2,3)
下载数据对象('mogreps-uk',文件名)
listofcubes=iris.load(文件名)
空气温度=管道提取列表(“空气温度”)
表面温度=空气温度[0]
dim\u time,dim\u lat,dim\u long=“时间”,“栅格纬度”,“栅格经度”
时间线=表面温度坐标(变暗时间)。点
时间自=str(表面温度坐标(尺寸时间)。单位)
横向跳线=表面温度坐标(尺寸横向)点
长电线=表面温度坐标(尺寸长)点
时间记录=[str(单位num2date(时间记录[i],时间自,单位日历\U标准)],用于输入i
范围(长度(时间线))]
lat_记录=[lat_线[lat_记录](LAN(lat_线))]
long_records=[long_cords[long_recorded]用于范围内记录的long_(len(long_cords))]
打印(len(时间记录)、len(横向记录)、len(纵向记录))
打印(表面温度形状)
数据尺寸=透镜(表面温度形状)
打印(“文件写入开始-->”,datetime.datetime.now()
以open(filename+'.curated',w')作为文件句柄:
对于t,枚举中的时间记录(时间记录):#迭代时间-4
如果数据大小=3,则t_a=表面温度[t],否则表面温度[t][0]
对于lat,枚举中的lat_记录(lat_记录):#迭代lat-548
lat_a=t_a[lat]
iter\u start\u time=datetime.datetime.now()
横向线=列表()
对于lng,枚举中的long_记录(long_记录):#迭代long 421
data=str(lat_a[lng].data.min())需要很长时间
lat_行。追加(时间记录+','+str(lat_记录)+','+str(长记录)+','+data++'\n')
filehandle.writelines(横向线)
打印(t,时间记录,纬度,纬度记录,“以秒为单位的时间->”,
(datetime.datetime.now()-iter\u start\u time).seconds)
如果名称=“\uuuuu main\uuuuuuuu”:
加载_数据()

首次使用iris.load读取多维数据集时,实际数据数组不会加载到内存中(请参见《iris用户指南》中的)。因为在访问
子多维数据集.data
之前要对多维数据集进行切片,所以实际加载是针对每个切片分别进行的。因此,每次执行“TAKES_LONG_time”行时,您都要返回并访问NetCDF文件

要在开始循环之前将所有内容加载到内存中,只需添加一行

surface_temp.data

这应该会加快速度,但可能并不理想,这取决于您有多少可用内存。可以通过在for循环中选择不同的级别来实现数据(即
ta.data
la.data
)。

澄清一点:在
filehandle.writelines(lat\u行)
中有多少行要写入?从代码中我推断,如果数据是时间x纬度x长度x温度,那么
lat_a[lng]
应该已经是标量了-那么为什么要在
lat_a[lng].data.min()中调用
.min()