pool.startmap_async() 的列表理解语法

List comprehension syntax for pool.startmap_async()

看这里的例子:

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() 语句不使用一个?

稍微分解一下,

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列表中该行的行索引;否则你只会得到一堆结果,而没有一种简单的方法将它们与原始数据行相关联。