0

我们正在考虑使用 dask,尤其是它的惰性计算和 dag 功能。

我们有一个中等复杂的计算 dag,输入未知。我们希望能够提前构建它,然后在不同的输入上使用它。

我认为我们可以使用 dict / tuple 接口来做到这一点:

from dask.threaded import get
import pandas as pd
power = lambda x, y: x**y

dsk = {'x': pd.Series(pd.np.random.rand(20)),
       'y': 2,
       'z': (power, 'x', 'y'),
       'w': (sum, ['x', 'y', 'z'])}

然后我们就有dsk了便携的 dag,可以x用我们想要的任何东西替换。(实际上,我们最初不需要将其包含在上面)。

dsk['x'] = pd.Series(pd.np.random.rand(20))
get(dsk, 'w')

但是我们可以这样做dask.imperative吗?我的初步结果表明我们无法达到x

x=pd.Series()

def filter_below_3(ds):
    return ds[ds<3]

f=do(filter_below_3)
graph=f(x)

graph.dask
# {'filter_below_3-0ae5a18c-206d-4293-84b6-eb0d39243296': (<function __main__.filter_below_3>,  [])}

有办法吗?

4

1 回答 1

1

编辑

dask.do 和 dask.value 很久以前都重命名为 dask.delayed。有关更多信息,请参阅更改日志

原始答案

目前没有标准的方法来交换 dask.imperative 中的叶子值。但是,有几个不错的选择。

切换到dict/tuple界面

Dask.imperative 只是为你构建一个字典。您可以在构建字典后换出值。

from operator import add, mul
from dask import do, value
from dask.threaded import get

input = value('dummy-value', name='my-special-input')
x = do(add)(input, 1)
y = do(mul)(x, x)
dsk = y.dask

>>> dsk['my-special-input'] = 10
>>> get(dsk, y.key)
121

使用函数

所有 dask 命令式图的构建都应该相当便宜。您可以创建一个函数来为每个输入生成图表

def f(input):
    x = do(add)(input, 1)
    y = do(mul)(x, x)
    return y

>>> f(10).compute()
121
于 2016-02-23T16:32:19.333 回答