【发布时间】:2019-12-23 16:08:39
【问题描述】:
我希望并行化一个函数,该函数采用数字输入值的多个一维范围(形式为np.linspace(x,y,t))(这是可变的,但可以说它需要五个),从这些中创建一个网格范围,然后在这个网格上评估一些(5维)成本函数。在当前的形式中,它看起来像这样:
def func_5d(a,b,c,d,e):
return a + b + c + d + e
def range_search(a_range, b_range, c_range, d_range, e_range):
mesh = itertools.product(a_range, b_range, c_range, d_range, e_range)
func_eval = map(lambda x: (func_5d(np.array(x)), x), mesh)
return func_eval
所以,在这里我希望使用 dask 并行化函数 range_search。理想情况下,这将通过创建一个 dask 网格来完成,然后可以将其分块,然后使用多线程或多核处理映射到我们的成本函数。查看 dask 文档,似乎 dask.array 不包含任何合适的机制来实现这一点。有一个 dask.array.meshgrid 函数,从 numpy 库扩展而来,但这不支持分块。此外, dask.array 似乎不包含并行映射函数。但是,在 dask.bag 中有一个。但文档似乎表明 dask.bag 仅用作对原始数据(CSV、JSON 等格式)进行初步处理的模块。 Dask.bag 对象也有一个名为 product() 的方法,它似乎模仿了 itertools.product;但是,这只需要另一个 dask.bag 对象作为参数。因此,对 5 个数组进行网格划分需要这种方法被称为堆叠(4 次),除了丑陋之外,当输入的数量可变时也是低效的。
从这里开始,我真的不知道该去哪里。我已经完成了 dask 整理的 Jupyter Notebooks,但它们似乎无法回答我的问题。任何关于上述形式的并行函数的最佳方法的建议将不胜感激。
【问题讨论】:
标签: python parallel-processing dask