在延迟密钥中隐藏散列中的一些参数 (to_task_dask)
Hiding some parameters from the hashing in the delayed key (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 的愿景不相符?谢谢!
如果您的任务有特殊的命名方案,那么一种选择是使用 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 变体,该变体仅对您关心的输入进行标记化。
考虑以下用法:
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 的愿景不相符?谢谢!
如果您的任务有特殊的命名方案,那么一种选择是使用 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 变体,该变体仅对您关心的输入进行标记化。