2017-03-22 26 views
2

考慮以下用途:在延遲鍵隱藏一些參數從哈希(to_task_dask)

In [49]: class MyClass(dict): 
    ...:  def __init__(self,a): 
    ...:   self.a = a 
    ...:  def get(self): 
    ...:   return a 
    ...:  

In [50]: a = MyClass(10) 

In [51]: @delayed(pure=True) 
    ...: def myFunc(a): 
    ...:  return a 
    ...: 

In [52]: myFunc(a) 
Out[52]: Delayed('myFunc-96ed02ea2192c363a45cec74ef5eaefb') 

In [53]: myFunc(a) 
Out[53]: Delayed('myFunc-96ed02ea2192c363a45cec74ef5eaefb') 

In [54]: a = MyClass(10) 

In [55]: myFunc(a) 
Out[55]: Delayed('myFunc-96ed02ea2192c363a45cec74ef5eaefb') 

In [56]: a.a = 1000 

In [57]: myFunc(a) 
Out[57]: Delayed('myFunc-96ed02ea2192c363a45cec74ef5eaefb') 

In [58]: a['foo'] = 'bar' 

In [59]: myFunc(a) 
Out[59]: Delayed('myFunc-bf4162396d43f090e476de70d30de251') 

我在這裏的目的是要告訴DASK哪些參數計算功能純度緩存目的時使用。例如,如果對象具有一些具有一些數據檢索方法的子例程,並且這些方法又取決於內部參數(例如繪圖參數),則這很有用。如果我通過dask傳遞這個數據對象,我顯然不希望延遲實例的鍵在改變這些參數時發生改變。但是,我確實希望保存數據本身(基本上,這裏是self[key] = val,這就是發生的情況)。

這似乎這樣的伎倆。

我想問一下,將這種行爲的支持?或者,還有更好的方法?或者這與dask的願景不兼容?謝謝!

回答

2

如果你有你的任務特殊的命名方案,那麼一個選擇是與dask_key_name=關鍵字選項明確地提供一個名稱。

In [1]: import dask 

In [2]: @dask.delayed(pure=True) 
    ...: def f(x, y=10): 
    ...:  return x + y 
    ...: 

In [3]: f(1, y=10) 
Out[3]: Delayed('f-3361ad78bd5bb95a5f748567a245a09e') 

In [4]: f(1, y=11) 
Out[4]: Delayed('f-4bf1967f6713377c1c0fab72b60ebfd3') 

In [5]: f(1, y=10, dask_key_name='f-1') 
Out[5]: Delayed('f-1') 

In [6]: f(1, y=11, dask_key_name='f-1') 
Out[6]: Delayed('f-1') 

你也許可以一起使用與DASK的符號化功能dask.base.tokenize建立自己的dask.delayed變種,只有記號化,你關心的輸入。

+0

哦,是的,這是完美的謝謝! 我找了記號化文檔中你的建議之後,似乎這裏有相關的東西: http://dask.pydata.org/en/latest/examples/array-extend.html?highlight=tokenize – julienl

+0

dask.base。 tokenize是內部API,因此沒有很好的記錄。你給它東西,它產生一個令牌'記號化(「你好」,np.array(5)中,x = 10 1) - >「sf7g7gf98g7g8s7g'' – MRocklin

+0

是否有任何辦法有一個延遲的類的成員函數是確定性的? 我無法弄清楚這一點,並希望避免每次調用成員函數時都必須添加'dask_key_name'參數並計算一個標記。 基本上,定義一個延遲類,比如'myclass',任何調用都被認爲是純的,'myclass.func()'是很好的。用純延遲對象來裝飾函數是不夠的。這是否存在,我錯過了? 這會讓我的生活更加容易,謝謝! – julienl