我对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中使用多线程或多处理来加速模拟。我读到了它们之间的差异,但无法弄清楚我应该使用哪个。
我尝试了多处理(池和地图功能(以平行一个简化的功能版本,该功能仅将雨numpy阵列作为输入(假设每个房屋的水箱尺寸和屋顶面积相同,并且水需求始终是相同的简化的原因是,我无法理解如何引入多个参数。我有20个房屋要模拟。循环方法比多处理方法要快得多。我尝试了不同数量的2个池从2到20个。我试图使用管理选项分享过程之间的降雨数据,但没有成功。我读了很多。但是它们非常先进且难以理解。会很感激如何与功能或任何引用与类似示例的任何引用的提示。
简短的答案是:
如果您的函数是cpu绑定的 - 使用多处理,如果bound -bound-使用多线程。
答案更长:
Python具有一个名为GIL的出色功能,此锁提供了巨大的限制:一个文件可以在一个时间时通过一个线程来解释。因此,如果您有很多计算,则多线程看起来像是并行执行,但实际上,在特定时刻只有一个线程会处于活动状态。
结果,多线程对IO绑定的操作有益,例如,数据下载,您可以将文件设置为一个线程中下载并在不同的情况下进行其他操作,而不是等待下载以完成。
因此,如果要执行并行计算,最好使用多处理。但是您不应忘记每个过程都有自己的RAM(在线程之间共享多线程RAM(。
upd
有多种方法可以在进程之间拥有共享内存,您可以在此处找到更多信息:https://docs.python.org/2/library/multiprocessing.html#exchanging-objects-bets-betweew thee-processes。