如何使用 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))
如果您想要生成 vals
和 chars
元素的所有组合,您可以使用 itertools.product
(这是我最初假设您想要的):
combs = pool.starmap(combine, itertools.product(vals, chars))
作为旁注; itertools
还包含一个 starmap
函数,其工作方式与 multiprocessing
大致相同,除了按顺序在一个进程中执行所有调用。然而,这不能利用多核。
我想到了一个有趣的问题,希望有人能帮我解决这个问题! 我想使用多处理,所以我选择使用 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))
如果您想要生成 vals
和 chars
元素的所有组合,您可以使用 itertools.product
(这是我最初假设您想要的):
combs = pool.starmap(combine, itertools.product(vals, chars))
作为旁注; itertools
还包含一个 starmap
函数,其工作方式与 multiprocessing
大致相同,除了按顺序在一个进程中执行所有调用。然而,这不能利用多核。