Как ускорить применение следующего для цикла и функции? - PullRequest
7 голосов
/ 15 мая 2019

У меня есть следующее для цикла:

for j in range(len(list_list_int)):
    arr_1_, arr_2_, arr_3_ = foo(bar, list_of_ints[j])
    arr_1[j,:] = arr_1_.data.numpy()
    arr_2[j,:] = arr_2_.data.numpy()
    arr_3[j,:] = arr_3_.data.numpy()

Я хотел бы применить foo с многопроцессорной обработкой, главным образом потому, что для ее завершения требуется много времени.Я пытался сделать это партиями с помощью метода funcy chunks:

for j in chunks(1000, list_list_int):
    arr_1_, arr_2_, arr_3_ = foo(bar, list_of_ints[j])
    arr_1[j,:] = arr_1_.data.numpy()
    arr_2[j,:] = arr_2_.data.numpy()
    arr_3[j,:] = arr_3_.data.numpy()

Однако я получаю list object cannot be interpreted as an integer.Как правильно применять foo с помощью многопроцессорной обработки?

Ответы [ 3 ]

5 голосов
/ 15 мая 2019
list_list_int = [1,2,3,4,5,6]
for j in chunks(2, list_list_int):
  for i in j:
    avg_, max_, last_ = foo(bar, i)
2 голосов
/ 21 мая 2019

Если вы хотите выполнять параллельные операции над пустым массивом, я бы использовал Dask .

С помощью всего лишь нескольких строк кода ваша работа может быть легко запущена на нескольких процессах, а высокоразвитый планировщик Dask уравновесит вашу нагрузку. Огромное преимущество для Dask по сравнению с другими параллельными библиотеками, такими как joblib, заключается в том, что он поддерживает собственный нудистый API.

import dask.array as da

# Setting up a random array with dimensions 10K rows and 10 columns
# This data is stored distributed across 10 chunks, and the columns are kept together (1_000, 10)
x = da.random.random((10_000, 10), chunks=(1_000, 10))
x = x.persist()  # Allow the entire array to persist in memory to speed up calculation


def foo(x):
    return x / 10


# Using the native numpy function, apply_along_axis, applying foo to each row in the matrix in parallel
result_foo = da.apply_along_axis(foo, 0, x)

# View original contents
x[0:10].compute()

# View sample of results
result_foo = result_foo.compute()
result_foo[0:10]
2 голосов
/ 16 мая 2019

У меня не установлено chunks, но из документов, которые я подозреваю, он производит (для блоков размера 2, из:

alist = [[1,2],[3,4],[5,6],[7,8]]                                     
j = [[1,2],[3,4]]
j = [[5,6],[7,8]]   

, что приведет к ошибке:

In [116]: alist[j]                                                              
TypeError: list indices must be integers or slices, not list

И если ваш foo не может работать с полным списком списков, я не понимаю, как он будет работать с этим списком, разбитым на куски. Очевидно, он может работать только с одним подсписком за раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...