2017-01-26 10 views
2

Я бы ожидал, что в следующем коде первое вычисление займет 3 + сек, а второе - намного быстрее. Что я должен сделать, чтобы получить dask, чтобы избежать повторного выполнения вычисления клиенту? (я уже искал ответ на этот вопрос, относительно чистый = True и ничего не нашел)Избегайте повторного вычисления тех же значений в Dask?

from dask import delayed, compute 
from dask.distributed import Client 

@delayed(pure=True) 
def foo(a): 
    time.sleep(3) 
    return 1 

foo_res = foo(1) 

client = Client() 

import time 
t1 = time.time() 
results = compute(foo_res, get=client.get) 
t2 = time.time() 
print("Time : {}".format(t2-t1)) 


t1 = time.time() 
results = compute(foo_res, get=client.get) 
t2 = time.time() 
print("Time : {}".format(t2-t1)) 

выход:

Time : 3.01729154586792 
Time : 3.0170397758483887 

ответ

2

Вы должны использовать метод persist на клиенте

foo_res = client.persist(foo_res) 

Это начнет вычисление в фоновом режиме и сохранит результаты в памяти до тех пор, пока некоторая ссылка на foo_res в лету ур Python сессия

Соответствующая страница документа здесь: http://distributed.readthedocs.io/en/latest/manage-computation.html

+0

А я прошел через эти документы, но не нашел, что, спасибо! Мне очень нравится, как вы хэш args btw, который является объектно-ориентированным независимым, но специфичным для данных. Очень полезная библиотека, спасибо! – julienl

+1

Документ, который вы отправили, предполагает, что любой из 'persist',' compute' и т. Д. Будет работать до тех пор, пока ссылка остается. напр: 'событие foo_res_future = client.compute (foo_res)' Кажется, работает для меня является то, что правильно? – julienl

+0

Правильно, но это должно быть 'client.compute', а не' dask.compute'. Это по историческим причинам. – MRocklin