Синтаксис понимания списка для pool.startmap_async () - PullRequest
0 голосов
/ 15 июня 2019

Глядя на пример здесь:

https://www.machinelearningplus.com/python/parallel-processing-python/

Существует определение функции, которое должно быть распараллелено:

# Step 1: Redefine, to accept `i`, the iteration number
def howmany_within_range2(i, row, minimum, maximum):
    """Returns how many numbers lie within `maximum` and `minimum` in a given `row`"""
    count = 0
    for n in row:
        if minimum <= n <= maximum:
            count = count + 1
    return (i, count)

Пример starmap_async приведен ниже:

results = pool.starmap_async(howmany_within_range2, [(i, row, 4, 8) for i, row in enumerate(data)]).get()

Меня немного смущает этот синтаксис, в частности параметр "i" и то, как работает этот синтаксис перечисления.

Также в примере apply_asyncy () используется оператор pool.join (), но в выражении map_async () его нет?

1 Ответ

0 голосов
/ 15 июня 2019

Немного разбирая это,

data = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9],
]

arguments = [(i, row, 4, 8) for i, row in enumerate(data)]

print(arguments)

выходы (отформатированные)

[
  (0, [1, 2, 3], 4, 8),
  (1, [4, 5, 6], 4, 8),
  (2, [7, 8, 9], 4, 8),
]

, которые являются кортежами howmany_within_range2, будут выполнены, т.е.

howmany_within_range2(0, [1, 2, 3], 4, 8)
howmany_within_range2(1, [4, 5, 6], 4, 8)
howmany_within_range2(2, [7, 8, 9], 4, 8)

но параллельно.

enumerate используется здесь для легкого доступа к индексу строки в списке data;в противном случае вы просто получили бы кучу результатов без простого способа связать их с исходными строками данных.

...