几年来,我试图以每小时的分辨率来模拟许多住宅(数千个)的空间和热水热需求。
我有以下代码,目前每年大约需要1分钟,但我需要在许多年和不同地点进行此操作。天气数据是每小时监视的元数据的数据框。建筑物是一个类对象的元组,每个类是一个住宅,包含数据和功能(如waterdemand和heatdemand)。
import pandas as pd
for timestamp, data in weatherdata.iterrows():
for dwelling in range(len(Buildings)):
hotwater[dwelling] = Buildings[dwelling].waterdemand(timestamp)
heating[dwelling] = Buildings[dwelling].heatdemand(timestamp, data.ambtemp, data.solar, data.windspeed)
resultdict.append({ 'timestamp' : timestamp,
'Heating_kWh' : sum(heating),
'HotWater_kWh' : sum(hotwater) })
results = pd.DataFrame.from_dict(resultdict)
为了加快运行速度,内部循环可以并行运行。我已经探索过使用Numba和prange使此循环并行运行,但由于使用类函数和熊猫而无法以nopython模式运行,因此无法运行。我发现的替代方法是多处理,并且循环可以在并行进程中运行。我可以将内部循环编写为一个函数,但不确定如何使用多处理并行运行this-parallel_function。
def parallel_funct(timestamp, data):
for dwelling in range(len(Buildings)):
hotwater[dwelling] = Buildings[dwelling].waterdemand(timestamp)
heating[dwelling] = Buildings[dwelling].heatdemand(timestamp, data.ambtemp, data.solar, data.windspeed)
return sum(heating), sum(hotwater)
for timestamp, data in weatherdata.iterrows():
heating, hotwater = parallel_function(timestamp, data)
resultdict.append({ 'timestamp' : timestamp,
'Heating_kWh' : heating,
'HotWater_kWh' : hotwater })
results = pd.DataFrame.from_dict(resultdict)
我正在尝试通过多处理来实现这一点,但是不确定如何构造它。
from multiprocessing import Process
if __name__ == '__main__':
for timestamp, data in weatherdata.iterrows():
heating, hotwater = Process(target=parallel_funct(timestamp, data), args=len(Buildings))
resultdict.append({ 'timestamp' : timestamp,
'Heating_kWh' : heating,
'HotWater_kWh' : hotwater })
我知道如果没有其他数据和功能,此代码将无法正常工作,但欢迎您提供任何帮助。