Python多处理:调用Python脚本并将不同的参数传递给每个过程/执行



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

相关内容

  • 没有找到相关文章

最新更新