我正在尝试学习如何使用Python的multiprocessing
模块。我尝试着以非并行和并行的方式编写相同的代码。问题在于他们返回的结果不同。
这是非并行版本:
import numpy as np
m = 3
num_points = 200
iterMax = 20
NMax = 3
np.random.seed(0)
y = np.random.rand(num_points,m)
w = list(range(NMax - 1))
for N in range(NMax-1):
w[N] = np.random.uniform(0,1,(N+2,np.size(y,axis=1))) - 0.5
iterCount = 1
while iterCount < iterMax:
for selectedInput in y:
w[N] = w[N] + (np.random.rand() - 0.5) * selectedInput
iterCount += 1
for i in w:
print(i)
这是并行化的版本:
import numpy as np
import multiprocessing as mp
m = 3
num_points = 200
iterMax = 20
NMax = 3
np.random.seed(0)
y = np.random.rand(num_points,m)
def neuron_run(N):
w = np.random.uniform(0,1,(N+2,np.size(y,axis=1))) - 0.5 # Initialize weights
iterCount = 1
while iterCount < iterMax:
for selectedInput in y:
w = w + (np.random.rand() - 0.5) * selectedInput
iterCount += 1
return w
if __name__ == '__main__':
w = []
pool = mp.Pool(processes=NMax)
for N in range(NMax-1):
pool_result = pool.apply_async(neuron_run, args = (N,))
w.append(pool_result.get())
pool.close()
pool.join()
for i in w:
print(i)
由于以下行,两者都应返回相同的w
:np.random.seed(0)
。但事实并非如此。
错误在哪里?我找不到它。
答案 0 :(得分:2)
seed
强制“随机”结果重复,是的。
但是,如果您并行运行多个进程,则每个进程都有其自己的种子值和随机值。
例如,如果带有seed
的单进程代码产生了这六个“随机”值:5、6、7、8、9、10,则在六个进程中执行一个random
parallel将在每个变量中仅生成第一个值(5)。同样,在三个进程中执行两个random
调用将在每个进程中生成“随机”值5和6。
换句话说,不要期望random.seed
在多个过程中做您想做的事情。那永远都行不通。