2014-11-06 50 views
2

我需要做一些強烈的數值計算,幸運的是python提供了非常簡單的方法來實現並行化。然而,我得到的結果是非常奇怪的,經過一些trial'n錯誤,我偶然發現了這個問題。Python並行編程問題

下面的代碼簡單地計算數字的隨機樣本的平均值,但說明我的問題:

import multiprocessing 
import numpy as np 
from numpy.random import random 

# Define function to generate random number 
def get_random(seed): 
    dummy = random(1000) * seed 
    return np.mean(dummy) 

# Input data 
input_data = [100,100,100,100] 

pool = multiprocessing.Pool(processes=4) 
result = pool.map(get_random, input_data) 
print result 

for i in input_data: 
    print get_random(i) 

現在輸出看起來是這樣的:

[51.003368466729405, 51.003368466729405, 51.003368466729405, 51.003368466729405] 

的並行化,這始終是同樣的

和這樣的正常不平行迴路:

50.8581749381 
49.2887091049 
50.83585841 
49.3067281055 

正如你所看到的,並行化只是返回相同的結果,儘管它應該計算出的差異就像循環一樣。現在,有時我只能得到3個相同的數字,其中一個與另一個不同3.

我懷疑有些內存分配給所有子進程... 我想知道這裏發生了什麼以及什麼是什麼修復看起來像。 :)

感謝

回答

2

當您使用multiprocessing,你在談論不同的進程。不同的流程意味着不同的Python解釋器。不同的解釋器意味着不同的隨機狀態。如果您沒有在每個進程中獨特地播種隨機數生成器,那麼您將從每個進程獲得相同的起始隨機狀態。

+0

嗯。很高興知道,謝謝,但不幸的是,我無法看到一種方法來實現我的例程,因爲我使用隨機數生成器多次使用不同的實例。有沒有解決這個問題的另一種方法? – HansSnah 2014-11-06 18:23:21

+1

在並行計算隨機數之前,使用'numpy.random.seed'將種子分發到每個進程。這需要獲得獨特的種子,這可能就像在主進程中生成一些隨機數字一樣簡單,或者只是枚舉池中工作人員的數量1到n。 – mobiusklein 2014-11-06 18:28:59

+0

啊!確實。如果我簡單地把np.random.seed()放在get_random函數中,我會得到不同的結果。完美和非常感謝! – HansSnah 2014-11-06 18:55:36

0

答案是在每個過程中放入一個新的隨機種子。更改功能爲

def get_random(seed): 
    np.random.seed() 
    dummy = random(1000) * seed 
    return np.mean(dummy) 

給出了想要的結果。