我正在尝试使用 IPython 的并行环境,到目前为止,它看起来很棒,但我遇到了问题。假设我有一个函数,在库中定义
def func(a,b):
...
当我想评估 a 的一个值和 b 的一堆值时,我会使用它。
[func(myA, b) for b in myLongList]
显然,真正的函数更复杂,但问题的本质是它需要多个参数,我只想映射其中一个。问题是 map、@dview.parallel 等映射所有参数。
所以假设我想得到 func(myA, myLongList) 的答案。这样做的明显方法是使用 functools.partial 或就像
dview.map_sync(lambda b: func(myA, b), myLongList)
但是,这在远程计算机上无法正常工作。原因是当 lambda 表达式被腌制时,不包括 myA 的值,而是使用远程机器上本地范围的 myA 的值。当闭包被腌制时,它们关闭的变量不会。
我能想到的两种实际可行的方法是为每个参数手动构造列表,并对所有参数进行映射,
dview.map_sync(func, [myA]*len(myLongList), myLongList)
或者可怕地使用数据作为函数的默认参数,迫使它被腌制:
# Can't use a lambda here b/c lambdas don't use default arguments :(
def parallelFunc(b, myA = myA):
return func(myA, b)
dview.map_sync(parallelFunc, myLongList)
真的,当真正的函数需要很多参数并且更复杂时,这一切似乎都被扭曲了。有一些惯用的方法吗?就像是
@parallel(mapOver='b')
def bigLongFn(a, b):
...
但据我所知,不存在像“mapOver”这样的东西。我可能对如何实现它有一个想法......这只是一个非常基本的操作,应该存在支持,所以我想检查我是否遗漏了一些东西。