在Python多处理库中,是否存在支持多个参数的pool.map变体?
text = "test"
def harvester(text, case):
X = case[0]
text+ str(X)
if __name__ == '__main__':
pool = multiprocessing.Pool(processes=6)
case = RAW_DATASET
pool.map(harvester(text,case),case, 1)
pool.close()
pool.join()
16 回答
在J.F. Sebastian回答了解了itertools后,我决定更进一步,编写一个负责并行化的
parmap
包,在python-2.7和python-3.2(以及后来的)上提供map
和starmap
函数,可以使用任意数量的位置论证 .安装
如何并行化:
我已将parmap上传到PyPI和github repository .
例如,问题可以回答如下:
另一种方法是将列表列表传递给单参数例程:
人们可以用一个最喜欢的方法构建一个参数列表 .
#“如何采取多个参数” .
您可以使用以下两个函数,以避免为每个新函数编写包装器:
使用函数
function
以及参数列表arg_0
,arg_1
和arg_2
,如下所示:更好的方法是使用 decorator 而不是手动编写 wrapper function . 特别是当您有许多要映射的函数时,装饰器将通过避免为每个函数编写包装来节省您的时间 . 通常装饰函数不可选,但我们可以使用
functools
来绕过它 . 更多的讨论可以找到here .这里的例子
然后你可以用压缩参数映射它
当然,您可以在Python 3(> = 3.3)中使用Pool.starmap,如其他答案中所述 .
我认为以下会更好
产量
在官方文档中声明它只支持一个可迭代参数 . 我喜欢在这种情况下使用apply_async . 在你的情况下,我会这样做:
有一个
multiprocessing
的分支叫pathos(注意:使用github上的版本),不需要starmap
- Map 函数镜像python的 Map 的API,因此map可以采用多个参数 . 使用pathos
,您通常也可以在解释器中执行多处理,而不是卡在__main__
块中 . 在经过一些温和的更新后,Pathos即将发布 - 主要是转换为python 3.x.答案取决于版本和情况 . 最近版本的Python(自3.3以来)最常见的答案首先在下面由J.F. Sebastian .1使用Pool.starmap方法,该方法接受一系列参数元组 . 然后它会自动从每个元组解包参数并将它们传递给给定的函数:
对于早期版本的Python,您需要编写一个辅助函数来显式解包参数 . 如果你想使用
with
,你还需要编写一个包装器来将Pool
转换为上下文管理器 . (感谢muon指出这一点 . )在更简单的情况下,使用固定的第二个参数,您也可以使用
partial
,但仅限于Python 2.7 .这很大程度上取决于他的答案,而答案本应该被接受 . 但由于这个问题一直停留在最顶层,因此最好为未来的读者改进它 .
对于python2,你可以使用这个技巧
使用 Python 3.3+ 与
pool.starmap():
结果:
如果您愿意,还可以zip()更多参数:
zip(a,b,c,d,e)
如果您希望将常量值作为参数传递,则必须使用
import itertools
然后使用zip(itertools.repeat(constant), a)
.Python 3.3包含pool.starmap() method:
对于旧版本:
输出
注意这里如何使用itertools.izip()和itertools.repeat() .
由于the bug mentioned by @unutbu,您无法在Python 2.6上使用functools.partial()或类似功能,因此应明确定义简单的包装函数
func_star()
. 另见the workaround suggested by uptimebox .python2的更好解决方案:
2 3 4
1 2 3
0 1 2
出[]:
[3,5,7]
另一个简单的替代方法是将函数参数包装在元组中,然后包装应该在元组中传递的参数 . 在处理大量数据时,这可能并不理想 . 我相信它会为每个元组制作副本 .
以随机顺序给出输出:
从python 3.4.4开始,您可以使用multiprocessing.get_context()来获取上下文对象以使用多个start方法:
或者你只是简单地替换
通过: