繁体   English   中英

如何让 multiprocessing.Pool().starmap() 返回 iterable

[英]How to get multiprocessing.Pool().starmap() to return iterable

我正在尝试从 function 以及 output 的输入构造一个 dataframe。之前我使用的是循环

for i in range(x):
    for j in range(y):
        k = func(i, j)
        (Place i, j, k into dataframe)

但是范围很大,所以我尝试使用 multiprocessing.Pool() 来加快速度

with mp.Pool() as pool:
    result = pool.starmap(func, ((i, j) for j in range(y) for i in range(x))
    (Place result into dataframe)

但是,使用 pool 我不再可以访问 i 和 j,因为它们只是 function 的输入

我试图让 function 返回输入,但随着 for 循环数量的增加,这并没有多大意义,因此如何将 iterables 传递到 starmap 中?

您的starmap版本和普通版本不等效。 在生成器表达式中使用多个循环时,外层循环首先出现。 所以电话应该是:

result = pool.starmap(func, ((i, j) for i in range(x) for j in range(y)))

回到这个问题,就像我在评论中提到的那样,starmap 以与提交顺序相同的顺序返回任务结果。 因此,考虑到您唯一不想并行化的是func调用,您可以简单地for append 所有结果放在一个列表中,根据y的值(列数)将其分块,然后在pool 同时获取i , j的值和func的返回值。 例子:

import multiprocessing as mp


def func(i, j):
    return f"{i}{j}"


# https://stackoverflow.com/a/17483656/16310741
def chunks(l, n):
    return [l[i:i+n] for i in range(0, len(l), n)]


if __name__ == "__main__":
    x = 3
    y = 4

    with mp.Pool() as pool:
        # ['00', '01', '02', '03', '10', '11', '12', '13', '20', '21', '22', '23']
        result = pool.starmap(func, ((i, j) for i in range(x) for j in range(y)))

        # [['00', '01', '02', '03'], ['10', '11', '12', '13'], ['20', '21', '22', '23']]
        result = chunks(result, y)  

        for i in range(x):
            for j in range(y):
                curr_result = result[i][j]
                print(i, j, curr_result)
                # Do something with i, j, and curr_result

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM