Dask 运行 并行不同列表中元素的所有组合

Dask run all combination of elements in different lists in parallel

我正在尝试 运行 使用 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]

在网上查了很多,都没有找到解决办法。 非常感谢。

可以在使用 dask 之前改进代码段。可以直接遍历列表(即使用 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)