【问题标题】:how do I parallelize a simple python def with multiple argument [duplicate]如何并行化具有多个参数的简单 python def [重复]
【发布时间】:2013-05-01 18:15:42
【问题描述】:

我想并行化一个 python 脚本。我已经创建了一个定义:

def dummy(list1,list2):
  do usefull calculations ...

list1 和 list2 包含我应该阅读的文件名列表,然后用它们进行计算。文件是独立的。 list1 和 2 包含相同数量的参数。

让我们假设我有 2 个 CPU(我想强加要使用的 CPU 数量)。我希望第一个 cpu 使用仅包含 list1 和 list2 的前半部分的列表调用定义,同时第二个 cpu 应该使用 list1 和 list2 的后半部分调用相同的 def dummy。

类似:

import multiprocessing
nb_cpus = 2
pool = multiprocessing.Pool(processes=nb_cpus)
for ii in nb_cpus:
  list_half1 = list1[0:max/nb_cpus]
  list_half2 = list2[0:max/nb_cpus]
  result[ii] = pool.map(dummy,list_half1,list_half2)

问题是 pool.map 只有在 def 有 1 个参数并且我不能循环 cpus 时才能工作。

感谢您对这个问题的任何帮助!

PS:我不可能将两个参数合并为一个,因为在实际情况下,我传递了更多参数。

【问题讨论】:

    标签: python parallel-processing multiprocessing


    【解决方案1】:

    首先,您不需要自己拆分列表,multiprocessing.Pool 会为您完成。

    要将多个参数作为单个参数传递给您的函数,您只需将列表压缩在一起,如下所示:

    import multiprocessing
    
    def myFunction(arguments):
        item1, item2 = arguments
        ...
    
    nb_cpus = 2
    pool = multiprocessing.Pool(processes=nb_cpus)
    results = pool.map(myFunction, zip(list1, list2))
    

    【讨论】:

    • 或者使用pool.starmap调用myFunction(*item)
    • 感谢您的回复。问题是我的一些论点不能在 cpus 中拆分,而是传递给每个 cpus。我该怎么做?
    • 我通过定义一个全局变量来解决这个问题。感谢您的帮助。
    猜你喜欢
    • 2017-02-18
    • 2021-03-14
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 2020-09-18
    • 2012-04-04
    • 1970-01-01
    • 2018-10-17
    相关资源
    最近更新 更多