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
是非固定的,y
与z
均传入一个定值,可以使用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
, y
与z
均为非固定的,有两种方法可以解决。
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)