Python多参数并行计算

Python使用multiprocessing模块可以实现多核并行计算显著提高重复性for循环的运行效率(实现方法可见Python使用多核心进行并行计算 | Xiaoran Wu),但传统方法并行时只能接收一个参数。本文展示了需要输入多个参数的几种情况及解决方案。


以下是一个简单的并行计算例子:

import multiprocessing

def workfun(m):
    return m

if __name__=='__main__':
    m = range(10)
    pool = multiprocessing.Pool(processes=2)
    res = pool.map(workfun, m)
    print(res)

其中workfun()函数是需要并行的函数,此时只有一个输入参数m。若定义一个新的workfun()为:

def workfun(x, y, z):
    return x + y + z

由于pool.map()函数只能同时传入一个参数,因此无法对新的workfun()函数进行并行计算。对于输入的参数值为固定或非固定的几种情况有不同的处理方案。

一、只有一个参数为非固定值

x是非固定的,yz均传入一个定值,可以使用partial模块修饰原函数,其作用是复刻原函数,同时指定其中部分输入参数的值。

import multiprocessing
from functools import partial

def workfun(x, y, z):
    return x + y + z

if __name__=='__main__':
    x = y = z = range(10)
    partial_work = partial(workfun, y=1, z=2)
    pool = multiprocessing.Pool(processes=2)
    res = pool.map(partial_work, x)
    print(res)

二、有多个参数为非固定值

x, yz均为非固定的,有两种方法可以解决。

1. 将输入参数打包

当输入参数不多时,可以使用zip()函数将输入打包成一个成参数,并在workfun()函数中解包后继续计算。

import multiprocessing

def workfun(input):
    x, y, z = input
    return x + y + z

if __name__=='__main__':
    x = y = z = range(10)
    input = zip(x,y,z)
    pool = multiprocessing.Pool(processes=2)
    res = pool.map(workfun, input)
    print(res)
2. 使用pathos模块并行计算

pathos.multiprocessing模块是multiprocessing模块的复刻和加强,模块下的ProcessingPool模块可以直接实现多变量的并行计算。

from pathos.multiprocessing import ProcessingPool

def workfun(x, y, z):
    return x + y + z

if __name__=='__main__':
    x = y = z = range(10)
    pool = ProcessingPool(processes=2)
    res = pool.map(workfun, x, y, z)
    print(res)
Xiaoran Wu
Xiaoran Wu
Master’s student