请考虑以下用法:
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的愿景不兼容?谢谢!
答案 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变体,该变体仅标记您关注的输入。