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



我试图用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,一个选项是使用delayedAPI。通过用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)

最新更新