i有一个(大而复杂的(python脚本,该脚本由几个类别生成许多变量的时间序列。每个模型运行与其他模型都不同(如果我不设置随机种子(。我必须并行多次运行该模型,并且我想控制每个模型/过程的随机种子。
到目前为止,脚本的来电者看起来像这样:
import os
from multiprocessing import Pool
n_cores = 2
n_iterations = 6
def run_process(process):
os.system('python mymodel.py')
if __name__ == '__main__':
p = Pool(n_cores)
p.map(run_process, range(n_iterations))
我需要这样的东西:
import os
from multiprocessing import Pool
import random as rd
list_seeds = list(range(-10, 10, 1))
n_cores = 2
n_iterations = len(list_seeds)
mycounter = 0
def run_process(process):
rd.seed(list_seeds[mycounter])
mycounter += 1
os.system('python mymodel.py')
if __name__ == '__main__':
p = Pool(n_cores)
p.map(run_process, range(n_iterations))
我无法以这种方式设置调用脚本的随机种子(或通过任何其他论点(。请向我展示如何实现这一目标的方法(如果有的话(,到目前为止,我发现的讨论/问题对我没有什么帮助/混乱...
谢谢!
编辑:无论如何,打电话给其他脚本是一个坏主意吗?这样,我想不可能通过任何论点。我可以尝试的方法:定义一个函数,该函数以同一脚本运行myModel,并将此函数赋予多处理作为参数的多处理。有人尝试过吗?
您可以使用partial
将种子列表运输到过程函数:
def run_process(list_seeds, iteration):
rd.seed(list_seeds[iteration])
os.system('python mymodel.py')
if __name__ == '__main__':
from functools import partial
func_to_multiprocess = partial(run_process, list_seeds)
p = Pool(n_cores)
p.map(func_to_multiprocess , range(n_iterations))
我不明白的是,为什么您将进程传递给run_process()
?
您可以使用starmap通过多个参数,以便您可以跟踪工人功能外的种子。
import random
from multiprocessing import Pool
def run_process(task_nr,seed):
result = random.Random(seed).random()
print ('Task number {} resulted in: {}'.format(task_nr,result))
if __name__ == '__main__':
n_cores = 2
n_iterations = 6
# generate a list of tasks
tasks = range(n_iterations+1)
# determine seeds
seeds = [1,1,1,2,2,3]
# create pool with 2 processes
p = Pool(processes=n_cores)
# use starmap to map multiple arguments onto process
p.starmap(func=run_process, iterable=zip(tasks, seeds))
结果:
任务号0导致:0.13436424411240122
任务编号1导致:0.13436424411240122
任务编号2导致:0.13436424411240122
任务编号3导致:0.9560342718892494
任务编号4导致:0.9560342718892494
任务编号5导致:0.23796462709189137