我是python的新手。我需要使用以下功能模拟雨水箱中的简单水平衡:
def rain_tank_model(rain, water_demand,roof_area, tank_size, household_name):
# rain and water_demand time series are numpy arrays with over than 8 million recordings.
# each houshold has installed a rain tank with a specific size
v = [] # water volume in tanks
spill = [] # amount of water spills from rain tank
unmet_demand = [] # amount of unmet water demand
volume = 0.0 # stored volume at the start of the simulation
for i in range(len(rain)):
volume += rain[i] * roof_area - water_demand[i]
if volume < 0. : #volume cannot be negative
unmet_demand.append(volume * -1)
volume = 0
v.append(volume)
spill.append(0.)
if volume > tank_size: #water should spill from the tank
spill.append(volume - tank_size)
volume = tank_size
v.append(volume)
unmet_demand.append(0.)
else:
spill.append(0.)
v.append(volume)
unmet_demand.append(0.)
file = open(str(household_name)+".txt", 'w')
for i in range(len(v)):
line =str(v[i])+"\t"+str(spill[i])+"\t"+str(unmet_demand[i])+"\n"
file.write(line)
file.close()
我需要为50,000个房屋运行此功能,每个房屋都有特定的雨水箱大小,屋顶面积和用水需求时间系列。我可以通过将函数放在循环中并遍历房屋来完成此操作。由于每个模拟都是完全独立的(它们只需要访问相同的输入雨阵),我想也许我可以在python中使用多线程或多处理来加速模拟。我读到了他们之间的差异,但无法弄清楚我应该使用哪一个。
我尝试了多处理(池和地图功能)来并行简化版本的功能,只需要将雨水阵列作为输入(假设每个房屋的水箱大小和屋顶面积相同,水需求总是简化的原因是我无法理解如何引入多个参数。我有20个房子要模拟。循环方法明显快于多处理方法。我尝试了不同数量的池,从2到20.我尝试使用manage选项在进程之间共享rain数据但是没有成功。我阅读了很多,但是它们非常先进且难以理解。请注意如何并行功能或任何功能参考类似的例子。
答案 0 :(得分:0)
简短的回答是:
如果你的函数是CPU绑定的 - 使用多处理,如果是IO绑定的 - 使用多线程。
答案稍长:
Python有一个很棒的功能叫GIL,这个锁提供了很大的限制:一个文件可以在一个时刻由一个线程解释。因此,如果您有大量计算,多线程将看起来像并行执行,但事实上,在特定时刻只有一个线程处于活动状态。
因此多线程有利于IO绑定操作,例如数据下载,您可以将文件设置为在一个线程中下载并在不同的位置执行其他操作,而不是等待下载完成。
因此,如果要执行并行计算,最好使用多处理。 但是你不应该忘记每个进程都有自己的RAM(多线程RAM在线程之间共享)。
<强> UPD 强>
有多种方法可以在进程之间建立共享内存,您可以在此处找到更多信息:https://docs.python.org/2/library/multiprocessing.html#exchanging-objects-between-processes。