优化复杂生态模型的平衡

问题描述 投票:0回答:1

我正在尝试在Dask环境中运行生态模型。尽管我并不完全满意计算的速度。我在单台计算机上本地运行。下面的代码是否有一些值得注意的快速改进:

from dask_open import dask_slice
from dask.distributed import Client
from calc_si_no_bloom import calc_si_no_bloom
import time
import dask
client = Client(processes=False)
start_time = time.clock()
path_tx_01 = r'C:\Users\eobs_data\tx_mean_0.1_hom.nc'
path_tn_01 = r'C:\Users\eobs_data\tn_mean_0.1_hom.nc'
mindask, latlon, latitude = dask_slice(path_tn_01, 1980, 2018,250, -25, 45, 34, 72)
maxdask, latlon, latitude = dask_slice(path_tx_01, 1980, 2018,250, -25, 45, 34, 72)
lazy_results = dask.delayed(calc_si_no_bloom)(mindask,maxdask,latitude) 
# mindask and maxdask have a chunksize of (1, 20000, 250) and 39 chunks 
lfmtx, lfrz = lazy_results.compute()
print(time.clock() - start_time, "seconds for model run")

dask_slice函数:

def dask_slice(path, startyear, endyear, ndays, latmin, latmax, lonmin, lonmax):
data = xr.open_dataarray(path)
data = data.sel(time=slice('1950-01-01','2018-12-31'))
data = data.sel(latitude=slice(latmin,latmax))
data = data.sel(longitude=slice(lonmin,lonmax))
data = data.stack(latlon=['latitude','longitude'])
latlon = list(data.latlon.values) #latlon[45693] = (49.875,14.875)
latitude = data.latitude.values
group = data.groupby('time.year')
list_group = list(group)
dictio = dict((x,y) for x,y in list_group)
lijst = []
for i in range(startyear,endyear+1):
    year = dictio[i].values[:ndays,:]
    lijst.append(year)
daskarray = daar.stack(lijst, axis=0)
daskarray_F = tempunits(daskarray, 'C', 'F')
daskarray = np.swapaxes(daskarray_F,1,2)
return daskarray, latlon, latitude

模型本身(calc_si_no_bloom)从最小和最大温度计算累积温度。它调用了许多不同的函数,所有这些函数都包含许多for循环。更改构成模型的功能的结构是否还有其他意义?还是我没有有效地实现Dask?]

提前感谢!

python performance optimization dask distributed-computing
1个回答
0
投票

提高代码性能的第一步通常是衡量缓慢的情况。我建议阅读Dask关于Understanding Performance的文档,然后按照其中的一些建议进行操作。

完成这项工作后,如果您有更具体的问题,那么我建议再次发布一个更具体的问题(SO很少用于一般的“帮助我改善代码”查询)]

© www.soinside.com 2019 - 2024. All rights reserved.