Python并行运行函数时map未覆盖参数全排列、Pool报错问题求助
问题原因及修复方案
1. 内置map未覆盖所有排列的问题
- 内置
map传入多个可迭代对象时,默认是按索引一一配对取元素传入函数,而非生成两个序列的笛卡尔积(所有排列组合),仅会返回长度等于两个序列最短长度的结果。 - 要实现所有排列组合的调用,需要先使用
itertools.product生成两个序列的笛卡尔积。
2. multiprocessing.Pool.map报错的问题
Pool.map的方法签名是map(func, iterable, chunksize=None),第三个参数是用于拆分任务的整数chunksize,你直接把b作为第三个参数传入,相当于把元组b赋值给了chunksize,内部逻辑中对chunksize做数值比较时就触发了tuple和int比较的类型错误。- 多参数传递给
Pool的方法有两种解决方案:- 把参数打包成元组作为单可迭代对象的元素,函数内部手动拆包
- 直接使用
Pool.starmap方法,该方法会自动将可迭代对象里的每个元组拆包作为参数传给目标函数
注意:Windows系统下使用
multiprocessing必须把进程启动逻辑放在if __name__ == '__main__'代码块内,避免反复 spawn 进程导致报错。
完整修复代码
from itertools import product from multiprocessing import Pool def f(n,m): x = n * m return x a = (1,2,3,4,5) b = (3,4,7,8,9) # 原生map实现所有排列调用 all_pairs = product(a, b) result = map(lambda p: f(*p), all_pairs) print(list(result)) # 并行实现所有排列调用 if __name__ == '__main__': pool = Pool(processes=4) # 用starmap自动拆包元组参数,传入笛卡尔积序列 print(*pool.starmap(f, product(a, b))) pool.close() pool.join()
内容的提问来源于stack exchange,提问作者Ana
相关产品推荐
相关产品推荐

