gpt4 book ai didi

python - 如何系统地重用 Dask 中延迟函数的结果?

转载 作者:行者123 更新时间:2023-12-04 03:30:05 25 4
gpt4 key购买 nike

我正在使用 Dask 构建计算图。一些中间值将被多次使用,但我希望这些计算只运行一次。我一定是犯了一个小错误,因为事实并非如此。这是一个最小的例子:

In [1]:    import dask
dask.__version__

Out [1]: '1.0.0'

In [2]: class SumGenerator(object):
def __init__(self):
self.sources = []

def register(self, source):
self.sources += [source]

def generate(self):
return dask.delayed(sum)([s() for s in self.sources])

In [3]: sg = SumGenerator()

In [4]: @dask.delayed
def source1():
return 1.

@dask.delayed
def source2():
return 2.

@dask.delayed
def source3():
return 3.

In [5]: sg.register(source1)
sg.register(source1)
sg.register(source2)
sg.register(source3)

In [6]: sg.generate().visualize()

很遗憾,我无法发布生成的图形图像,但基本上我看到函数 source1 有两个单独的节点,该节点已注册两次。因此该函数被调用了两次。我宁愿让它被调用一次,结果被记住并在总和中加了两次。这样做的正确方法是什么?

最佳答案

您需要通过传递 pure=True 参数来调用 dask.delayed 装饰器。

来自dask delayed docs

delayed also accepts an optional keyword pure. If False, then subsequent calls will always produce a different Delayed

If you know a function is pure (output only depends on the input, with no global state), then you can set pure=True.

所以用那个

import dask

class SumGenerator(object):
def __init__(self):
self.sources = []

def register(self, source):
self.sources += [source]

def generate(self):
return dask.delayed(sum)([s() for s in self.sources])

@dask.delayed(pure=True)
def source1():
return 1.

@dask.delayed(pure=True)
def source2():
return 2.

@dask.delayed(pure=True)
def source3():
return 3.

sg = SumGenerator()

sg.register(source1)
sg.register(source1)
sg.register(source2)
sg.register(source3)

sg.generate().visualize()

输出和图表

Graph

使用 print(dask.compute(sg.generate())) 得到 (7.0,) 与您编写的相同,但没有额外的节点如图所示。

关于python - 如何系统地重用 Dask 中延迟函数的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67088478/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com