Вопрос
Мне интересно, возможно ли с помощью dask (в частности, dask-массивов) узнать, вычислено ли и когда что-то. Я думаю о модульных тестах, желающих узнать, сколько раз dask вычислял массив. Похоже на ложные объекты, зная, сколько раз они были вызваны. Что-то подобное уже существует? Если нет, то есть ли лучший способ, чем сделать пользовательский обратный вызов ? Если этого не существует, это то, что разработчики ядра dask хотели бы добавить в базовый dask для тестирования?
Любая помощь очень ценится.
Подробнее
Скажем, у меня есть функция, которая принимает xarray DataArray, делает с ним что-то и возвращает его. В некоторых случаях dask-массивы неявно преобразуются в numy-массивы, включая нового пользователя dask, который не знает лучшего способа что-либо сделать, дружественного к dask. Я хотел бы написать свои модульные тесты, чтобы убедиться, что я или другой участник случайно не повредят производительности функции. Это особенно важно, учитывая, что тестовые данные часто представляют собой упрощенную / небольшую версию реальных случаев, и прирост производительности при вычислении массива dask несколько раз может не наблюдаться в этих случаях.
Редактировать: Решение
Вот что я в итоге сделал как простое решение, основанное на ответе MRocklin.
class CustomScheduler(object):
def __init__(self, max_computes=1):
self.max_computes = max_computes
self.total_computes = 0
def __call__(self, dsk, keys, **kwargs):
self.total_computes += 1
if self.total_computes > self.max_computes:
raise RuntimeError("Too many dask computations were scheduled: {}".format(self.total_computes))
return dask.get(dsk, keys, **kwargs)
Затем я использую это так:
with dask.config.set(scheduler=CustomScheduler(0)):
# dask array stuff