使用dask延迟创建字典值

时间:2018-02-10 18:40:05

标签: python dictionary dask dask-delayed

我正在努力弄清楚如何让dask延迟工作在涉及创建字典的特定工作流程上。

这里的想法是func1,func2,func3可以同时独立运行,我希望这些函数的结果是新字典z中的值。

from dask.delayed import delayed

x1 = {'a': 1, 'b': 2, 'c': 3}
x2 = {'a': 4, 'b': 5, 'c': 6}

@delayed
def func1(d1, d2):
    return d1['a'] + d2['a']

@delayed
def func2(d1, d2):
    return d1['b'] - d2['b']

@delayed
def func3(d1, d2):
    return d1['c'] * d2['c']

z = {}
z['val1'] = func1(x1, x2)
z['val2'] = func2(x1, x2)
z['val3'] = func3(x1, x2)

当我运行以下内容时,出现错误:

>>> result_dict = z.compute()

AttributeError: 'dict' object has no attribute 'compute'

当我运行以下内容时,它会成功,但结果是元组而不是字典。

>>> result_dict = dask.compute(z)

({'val1': 5, 'val2': -3, 'val3': 18},)

如何计算结果以便返回字典?我这样做了吗?

1 个答案:

答案 0 :(得分:6)

如您所见,dask.compute返回结果元组

>>> dask.compute(z)
({'val1': 5, 'val2': -3, 'val3': 18},)

这是因为你可以为它提供许多参数,并为每个参数产生结果

>>> result_dict = dask.compute(x, y, z)
(..., ..., ...)

你不关心这个,你只想要第一个元素。您可以使用getitem [...]语法在Python中获取元组的第一个元素。

>>> dask.compute(z)[0]
{'val1': 5, 'val2': -3, 'val3': 18}