如何使用 pool.starmap 和 zip 将整个列表与单个元素组合并传递

How can I use pool.starmap and zip to combine and pass an entire list with a single element

我想到了一个有趣的问题,希望有人能帮我解决这个问题! 我想使用多处理,所以我选择使用 pool.starmap(myfunction,zip([1,2,3,4,5],['a','b','c','d','e'])) 以便传递多个参数。我想将整个列表 [1,2,3,4,5] 与第二个列表中的每个元素组合起来,例如

([1,2,3,4,5],'a'),([1,2,3,4,5],'b').....

而不是只组合列表中的单个元素,例如

(1,'a'),(2,'b')

我知道如何以一种愚蠢的方式做到这一点,即将列表乘以 5

new_list=[1,2,3,4,5]*5

然后用第二个列表

压缩 new_list

我现在想知道是否有更好的方法来做到这一点?

阅读您的评论后,我认为您正在寻找 itertools.repeat:

import itertools
import multiprocessing

def combine(val, char):
    return f'{val}{char}'

vals = [1, 2, 3, 4, 5]
chars = ['a', 'b', 'c', 'd', 'e']

pool = multiprocessing.Pool(3)
combs = pool.starmap(combine, zip(itertools.repeat(vals, 5), chars))

print(combs)

这比天真的方法占用内存更小,后者只是

combs = pool.starmap(combine, zip([vals]*5, chars))

如果您想要生成 valschars 元素的所有组合,您可以使用 itertools.product(这是我最初假设您想要的):

combs = pool.starmap(combine, itertools.product(vals, chars))

作为旁注; itertools 还包含一个 starmap 函数,其工作方式与 multiprocessing 大致相同,除了按顺序在一个进程中执行所有调用。然而,这不能利用多核。