当在包含numpy数组的dask.bag
上执行foldby
时,我从dask
/numpy
得到非常无意义的FutureWarning
消息。dask bag foldby with numpy arrays
def binop(a, b):
print('binop')
return a + b[1]
def combine(a, b):
print('combine')
return a + b[1]
seq = ((np.random.randint(0, 5, size=1)[0], np.ones(5,)) for _ in range(50))
db.from_sequence(seq, partition_size=10)\
.foldby(0, binop=binop, initial=np.zeros(5,), combine=combine)\
.compute()
目标是加起来一堆NumPy
数组。这会产生正确的结果,但也产生FutureWarning
消息(看起来像每个分区一个)NumPy
虽然它看起来好像他们来自dask
。
dask/async.py:247:FutureWarning:elementwise comparison failed;返回标代替,但在未来将执行的elementwise比较 回报FUNC(* args2)
只是增加了两个numpy
阵列,而不dask
不会产生这样有明确的一些参与与并行.foldby
这里。看起来在任何计算完成之前都会生成警告。
- 如何确定警告是否应该关注?
- 如果我应该关注它,我该如何让警告消失?
我使用python 3.6
DASK 0.14.1
和numpy的1.12.1
UPDATE
感谢@ MRocklin的答案,我开始寻找到这个多一点。因此,在dask.async.py
有问题的代码是this
def _execute_task(arg, cache, dsk=None):
....
if isinstance(arg, list):
return [_execute_task(a, cache) for a in arg]
elif istask(arg):
func, args = arg[0], arg[1:]
args2 = [_execute_task(a, cache) for a in args]
return func(*args2)
是有可能,dask
实际上是在试图遍历numpy
数组中args2 = [_execute_task(a, cache) for a in args]
,我不知道内部不够好(在所有的时候)的判断这些变量包含的内容。
我仍然不明白,虽然'dask'正在做的阵列产生的警告。该案例的评论为:“这个条件基本上意味着”我们注定要失败“,b/c”灵活的“dtypes - 字符串和无效 - 不能有自己注册的ufunc循环...。这是没有意义的,因为数组的'dtype'是'float64',而不是'string'或'void'。请参阅上面修改的问题 –
Dask.bag只是调用您提供的功能。它没有引入任何特殊的逻辑。 – MRocklin
我正确地认为,如果'init'是一个可调用的函数,它会为每个执行器调用一次吗?这就是'cytoolz'代码的样子 –