簡體   English   中英

如何系統地重用 Dask 中延遲函數的結果?

[英]How can I systematically reuse the results of delayed functions in Dask?

我正在使用 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()

遺憾的是,我無法發布生成的圖形圖像,但基本上我看到了注冊兩次的 function source1的兩個單獨節點。 因此 function 被調用了兩次。 我寧願讓它調用一次,結果被記住並在總和中添加兩次。 這樣做的正確方法是什么?

您需要通過傳遞pure=True參數來調用dask.delayed裝飾器。

dask 延遲的文檔

delay 也接受一個可選的關鍵字 pure。 如果為 False,那么后續調用將始終產生不同的 Delayed

如果您知道 function 是純的(輸出僅取決於輸入,沒有全局狀態),那么您可以設置 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()

Output 和圖表

圖形

使用print(dask.compute(sg.generate()))得到(7.0,)與您編寫的相同,但沒有圖像中看到的額外節點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM