【问题标题】:How can I use pool.starmap and zip to combine and pass an entire list with a single element如何使用 pool.starmap 和 zip 组合并传递带有单个元素的整个列表
【发布时间】:2018-02-28 06:06:21
【问题描述】:

我想到了一个有趣的问题,希望有人能帮我解决这个问题! 我想使用多处理,所以我选择使用 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

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

【问题讨论】:

    标签: python list zip pool


    【解决方案1】:

    阅读您的评论后,我假设您正在寻找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 函数大致相同,除了按顺序在一个进程中执行所有调用。但是,这不能利用多核。

    【讨论】:

    • 哦,不,我尝试了产品功能,但这不是我想要的,我想将整个列表“vals”与“chars”中的每个元素结合起来,而不是结合“vals”中的每个元素带有“字符”
    • 好的,但是你只是将列表乘以 5 的“幼稚”方法有什么问题?这样就行了,对吧?
    • 哦,是的,没有错,但我只是想知道是否有pythonic方法可以做到这一点,哈哈
    • 我会说它足够 Pythonic,可以按照您的建议将列表相乘。这是一个有点特殊的用例,很难给出真正严格的指导方针,确切地说什么时候不再是“Pythonic”。
    猜你喜欢
    • 2016-07-31
    • 2020-05-22
    • 2019-10-27
    • 1970-01-01
    • 2017-08-09
    • 2015-01-19
    • 2018-10-30
    • 2021-12-16
    • 2021-10-31
    相关资源
    最近更新 更多