Dask延迟最佳实践的批处理说明如何工作?

时间:2019-06-05 01:25:00

标签: python dask-delayed

我想我遗漏了一些东西(仍然是Dask Noob),但是我正在尝试进行批处理建议,以避免从此处避免太多的Dask任务:

https://docs.dask.org/en/latest/delayed-best-practices.html

,并且无法使其正常工作。 这是我尝试过的:

import dask

def f(x):
    return x*x

def batch(seq):
    sub_results = []
    for x in seq:
        sub_results.append(f(x))
    return sub_results

batches = []
for i in range(0, 1000000000, 1000000):
 result_batch = dask.delayed(batch, range(i, i + 1000000))
 batches.append(result_batch)

批次现在包含延迟的对象:

batches[:3]

[Delayed(range(0, 1000000)),
 Delayed(range(1000000, 2000000)),
 Delayed(range(2000000, 3000000))]

但是当我计算它们时,我得到了批处理函数指针(我认为?):

results = dask.compute(*batches)
results[:3]

(<function __main__.batch(seq)>,
 <function __main__.batch(seq)>,
 <function __main__.batch(seq)>)

我有两个问题:

  1. 这真的是应该如何运行,因为它似乎与Best practices页的第一行相反,该行说要像{{1} },因为它会立即运行而不是偷懒。

  2. 如何获得上述批处理运行的结果?

1 个答案:

答案 0 :(得分:1)

您的代码似乎缺少一对括号。不确定这是否是错字(???)。

根据文档中的示例,我认为您想要

result_batch = dask.delayed(batch)(range(i, i + 1000000))

我将batch, ran...替换为batch)(ran...的地方,因为对batch()函数的调用应该被延迟。

答案

  1. 在修正错字的情况下,您的代码对我来说很好用-现在将延迟计算。关于文档开始处的内容-用dask.delayed包装的内容很重要。使用dask.delayed( batch(range(i, i + 1000000)) )不会延迟对函数batch(...)的调用,因此它将立即运行。这是因为函数的输出已包装在dask.delayed中,因此输出(结果)将被延迟,这不是所需的工作流程。但是,dask.delayed(batch)(range(i, i + 1000000))延迟了对函数的调用(因为这里dask.delayed包装了函数本身)。我相信这是文档在最佳实践部分的开头要说的话。
  2. 同样,在修正拼写错误的情况下,您的代码按我的预期运行,并将冗长输出显示在屏幕上。