我有一個目前正在運行的模擬,但ETA大概是40個小時 - 我試圖通過多處理加速它。具有單一功能的Python多重處理
它基本上迭代一個變量(L)的3個值和第二個變量(a)的99個值。使用這些值,它本質上運行一個複雜的模擬並返回9個不同的標準偏差。因此(即使我還沒有這樣編碼),它本質上是一個函數,它將兩個值作爲輸入(L,a)並返回9個值。
這裏是代碼的精髓,我有:
STD_1 = []
STD_2 = []
# etc.
for L in range(0,6,2):
for a in range(1,100):
### simulation code ###
STD_1.append(value_1)
STD_2.append(value_2)
# etc.
這是我可以將它修改爲:
master_list = []
def simulate(a,L):
### simulation code ###
return (a,L,STD_1, STD_2 etc.)
for L in range(0,6,2):
for a in range(1,100):
master_list.append(simulate(a,L))
由於每個模擬的是獨立的,這似乎是一個理想的實現某種多線程/處理。
我到底該如何編碼?
編輯:此外,將所有內容按順序返回到主列表,或者如果多個進程正在工作,可能會出現故障嗎?
編輯2:這是我的代碼 - 但它無法正確運行。它詢問我是否想在運行它後立即殺死程序。
import multiprocessing
data = []
for L in range(0,6,2):
for a in range(1,100):
data.append((L,a))
print (data)
def simulation(arg):
# unpack the tuple
a = arg[1]
L = arg[0]
STD_1 = a**2
STD_2 = a**3
STD_3 = a**4
# simulation code #
return((STD_1,STD_2,STD_3))
print("1")
p = multiprocessing.Pool()
print ("2")
results = p.map(simulation, data)
編輯3:還有什麼是多處理的限制。我聽說它在OS X上不起作用,這是否正確?
我通常會做這樣的事情的方法是在你創建的所有可能的,其中循環使用'Pool.apply_async'就在那裏參數。然後在循環結束時,將'p.close();頁。加入()'然後等待;-) –