Параллельное выполнение вложенной функции с использованием многопроцессорности в Python - PullRequest
1 голос
/ 08 июля 2020

Я пытаюсь смоделировать потребность в пространстве и тепле горячей воды для многих жилищ (порядка тысяч) с почасовым разрешением в течение нескольких лет.

У меня есть следующий код, который в настоящее время занимает примерно 1 минуту в год, но я нужно делать это в течение многих лет и мест. Weatherdata - это фрейм данных отслеживаемых почасовых метданных. Buildings - это набор объектов класса, каждый из которых представляет собой жилище, содержащий данные и функции, такие как 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)

Чтобы ускорить процесс, внутренний l oop может работать параллельно. Я исследовал использование Numba и prange, чтобы заставить этот l oop работать параллельно, но не могу, так как он не может работать в режиме python из-за использования функций класса и pandas. Альтернатива, которую я нашел, - это многопроцессорность, и l oop запускается в параллельных процессах. Я могу написать внутренний l oop как функцию, но не уверен, как запустить только 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 })  

Я понимаю, что этот код не может работать без других данных и функций, но любая помощь будет приветствоваться.

...