隐藏延迟键中散列的一些参数(to_task_dask)

时间:2017-03-22 20:42:17

标签: 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的愿景不兼容?谢谢!

1 个答案:

答案 0 :(得分: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变体,该变体仅标记您关注的输入。