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