Dask ленивая инициализация очень медленная для понимания списка

Я пытаюсь понять, будет ли Dask подходящим дополнением к моему проекту, и написал несколько очень простых тестовых примеров, чтобы оценить его производительность. Тем не менее, Dask занимает относительно много времени, чтобы просто выполнить отложенную инициализацию.

@delayed
def normd(st):
    return st.lower().replace(',', '')

@delayed
def add_vald(v):
    return v+5

def norm(st):
    return st.lower().replace(',', '')

def add_val(v):
    return v+5

test_list = [i for i in range(1000)]
test_list1 = ["AeBe,oF,221e"]*1000

%timeit rlist = [add_val(y) for y in test_list]
#124 µs ± 7.25 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

%timeit rlist = [norm(y) for y in test_list1]
#392 µs ± 18.9 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%timeit rlist = [add_vald(y) for y in test_list]
#19.1 ms ± 436 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

rlist = [add_vald(y) for y in test_list]
%timeit rlist1 = compute(*rlist, get=dask.multiprocessing.get)
#892 ms ± 36.6 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%timeit rlist = [normd(y) for y in test_list1]
#18.7 ms ± 408 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

rlist = [normd(y) for y in test_list1]
%timeit rlist1 = compute(*rlist, get=dask.multiprocessing.get)
#912 ms ± 54.1 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

Я смотрел в Dask For Loop In Parallel и параллельно Dask для цикла медленнее, чем обычный цикл? и я попытался увеличить размер до 1 миллиона элементов, но пока обычный цикл занимает около секунды, цикл dask никогда не заканчивается. После ожидания полчаса, чтобы просто закончить ленивую инициализацию add_vald, я убил его.

Я не уверен, что здесь происходит, и был бы очень признателен за любые идеи, которые вы могли бы предложить. Спасибо!

1 ответ

При создании отложенного объекта dask делает несколько вещей:

  • вычисление уникального ключа для объекта на основе функции и входных данных
  • создание графического объекта для хранения нужных операций.

Вероятно, вы могли бы делать эти вещи немного быстрее с помощью собственного понимания dict -delayedпредназначена для удобства.

При выполнении каждой задачи требуются некоторые накладные расходы, будь то переключение потоков или обмен данными между процессами, в зависимости от выбранного планировщика. Это хорошо задокументировано. Кроме того, потоки внутри процесса фактически не будут выполняться параллельно для этой рабочей нагрузки из-за GIL Python.

Как правило, рекомендуется разбивать вашу работу на пакеты, чтобы накладные расходы на задачу были небольшими по сравнению со временем, которое требуется для выполнения задачи; так что использование dask становится целесообразным. Не забывайте первое правило dask: убедитесь, что dask вам нужен.

Другие вопросы по тегам