使用Python中的多处理使嵌套函数并行运行

时间:2020-07-08 19:11:36

标签: python parallel-processing multiprocessing

几年来,我试图以每小时的分辨率来模拟许多住宅(数千个)的空间和热水热需求。

我有以下代码,目前每年大约需要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 })  

我知道如果没有其他数据和功能,此代码将无法正常工作,但欢迎您提供任何帮助。

0 个答案:

没有答案
相关问题