Dask For Loop平行

B_M*_*ner 6 dask dask-delayed

我试图找到使用for循环并延迟dask的正确语法。我发现了一些教程和其他问题,但都不适合我的情况,这是非常基础的。

首先,这是并行运行for循环的正确方法吗?

%%time

list_names=['a','b','c','d']
keep_return=[]

@delayed
def loop_dummy(target):
    for i in range (1000000000):
        pass
    print('passed value is:'+target)
    return(1)


for i in list_names:
    c=loop_dummy(i)
    keep_return.append(c)


total = delayed(sum)(keep_return)
total.compute()
Run Code Online (Sandbox Code Playgroud)

这产生了

passed value is:a
passed value is:b
passed value is:c
passed value is:d
Wall time: 1min 53s
Run Code Online (Sandbox Code Playgroud)

如果我连续运行

%%time

list_names=['a','b','c','d']
keep_return=[]


def loop_dummy(target):
    for i in range (1000000000):
        pass
    print('passed value is:'+target)
    return(1)


for i in list_names:
    c=loop_dummy(i)
    keep_return.append(c)
Run Code Online (Sandbox Code Playgroud)

它实际上更快。

passed value is:a
passed value is:b
passed value is:c
passed value is:d
Wall time: 1min 49s
Run Code Online (Sandbox Code Playgroud)

我看过一些示例,其中说到Dask的开销很小,但这似乎花费了足够长的时间来证明,不是吗?

我实际的for循环涉及大量计算,其中我为各种目标建立了模型。

MRo*_*lin 5

这种计算

for i in range(...):
    pass
Run Code Online (Sandbox Code Playgroud)

受GIL约束。您将要使用multiprocessing或dask.distributed Dask后端,而不是默认的线程后端。我建议以下内容:

total.compute(scheduler='multiprocessing)
Run Code Online (Sandbox Code Playgroud)

但是,如果您的实际计算主要是Numpy / Pandas / Scikit-Learn / Other数字程序包代码,则默认的线程后端可能是正确的选择。

有关在调度程序之间进行选择的更多信息,请参见:http : //dask.pydata.org/en/latest/scheduling.html