是否可以使用 dask 命令来构建函数图,然后再提供输入?
Is it possible to use dask imperative to build function graphs and then supply inputs later?
我们正在考虑使用 dask,特别是其惰性计算和 dag 功能。
我们有一个中等复杂的计算 dag,具有未知输入。我们希望能够提前构建它,然后在不同的输入上使用它。
我想我们可以用字典/元组接口来做到这一点:
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>, [])}
有办法吗?
编辑
dask.do 和 dask.value 都在很久以前改名为 dask.delayed。有关详细信息,请参阅 changelog。
原答案
目前没有标准方法可以换出 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
我们正在考虑使用 dask,特别是其惰性计算和 dag 功能。
我们有一个中等复杂的计算 dag,具有未知输入。我们希望能够提前构建它,然后在不同的输入上使用它。
我想我们可以用字典/元组接口来做到这一点:
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>, [])}
有办法吗?
编辑
dask.do 和 dask.value 都在很久以前改名为 dask.delayed。有关详细信息,请参阅 changelog。
原答案
目前没有标准方法可以换出 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