![](/img/trans.png)
[英]How do I actually get dask to compute a list of delayed or dask-container-based results?
[英]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
裝飾器。
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.