【问题标题】:Using dask delayed to create dictionary values使用 dask 延迟创建字典值
【发布时间】:2018-02-10 18:40:04
【问题描述】:

我正在努力弄清楚如何延迟 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},)

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

【问题讨论】:

    标签: python dictionary dask dask-delayed


    【解决方案1】:

    如您所见,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}
    

    【讨论】:

    • 感谢您的解释。需要明确的是,func1func2func3 是否都同时执行(换句话说,我在这里做 dask 吗?)?我无法运行z.visualize(),因为我收到'dict' object has no attribute 'visualize' 错误以查看引擎盖下发生了什么。
    • 你正在做的很好。 dask 方法(如.compute())不起作用,因为它们不是 dask 对象,它们是普通的 Python 字典。在这种情况下,您可以类似地调用dask.visualize(z) 来获取图形的图像。
    猜你喜欢
    • 2021-12-25
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-14
    • 1970-01-01
    相关资源
    最近更新 更多