【问题标题】:Dask run all combination of elements in different lists in parallelDask 并行运行不同列表中的所有元素组合
【发布时间】:2022-01-07 16:02:03
【问题描述】:

我正在尝试使用 dask 对不同数组中所有元素的不同组合运行一个函数,但我正在努力应用它。

序列号如下:

for i in range(5):
    for j in range(5):
        for k in range(5):
            function(listA[i],listB[j],listC[k])
            print(f'{i}.{j}.{k}')
            k=k+1
        j=j+1
    i=i+1

此代码在我的计算机上运行时间为 18 分钟,而每个数组只有 5 个元素,我想在更大尺寸的数组上与 dask 并行运行此代码。 函数内部的所有计算并不相互独立。 您可以假设该函数的作用是:listA[i]*listB[j]*listC[k]

在网上搜索了很多之后,我找不到任何解决方案。 非常感谢。

【问题讨论】:

  • listAlistBlistC 的数组列表吗?
  • 不,每个列表都没有任何联系。
  • 对不起,我的意思是,列表的内容是什么? listA[i] 是数组吗?
  • 否,例如:listA = [1,2,3,4,5], listA[0] = 1
  • 那么我建议您将列表转换为真正的 NumPy 数组。这将允许您使用向量和矩阵数学函数进行计算,即使不使用 dask 也可以大大加快速度。如果需要,它还将使您的代码转换为 dask 变得更加容易。不幸的是,您的示例不够详细,我无法知道您需要哪些具体操作。特别是如果您可以包含一些示例输入和输出,那将有所帮助。

标签: python parallel-processing dask dask-distributed dask-delayed


【解决方案1】:

在使用dask之前可以改进sn-p。与其迭代索引然后在列表中查找相应的项目,不如直接迭代列表(即使用for item in list_A:)。由于在这种情况下我们对三个列表中的所有项目组合感兴趣,我们可以使用内置的combinations

from itertools import combinations
triples = combinations(list_A, list_B, list_C)
for i,j,k in triples:
     function(i,j,k)

要使用dask,一种选择是使用delayed API。通过用dask.delayed 包装function,我们可以立即获得对函数结果的惰性引用。收集所有惰性引用后,我们可以使用dask.compute 并行计算它们:

import dask
from itertools import combinations

triples = combinations(list_A, list_B, list_C)
delayeds = [dask.delayed(function)(i,j,k)for i,j,k in triples]
results = dask.compute(*delayeds)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-01
    • 2016-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多