【问题标题】:multiprocessing loop over a simple list?多处理循环遍历一个简单的列表?
【发布时间】:2022-11-22 04:34:53
【问题描述】:

我有一个调用自定义函数的函数,该函数比较数据框中的行并计算一些统计数据。 vt.make_breakpts 它需要一个数据框(数据)、一个键(唯一标识符)和一个日期字段(日期)来完成它的事情。我可以运行它并等待很长时间,它将遍历整个数据帧并输出通过比较序列(在本例中为日期)计算得出的统计数据帧。我有一个所有唯一键值的列表,希望将其传递给多处理,以便列表中的每个项目用于对输入 df 进行子集化,然后将该工作传递给处理器。所以我创建了一个 def 函数,它将值传递给自定义函数。

def taska(id, data, key, date):
    cdata = data[data[key]==id]
    return vt.make_breakpts (data=cdata, key=key, date=date)

然后使用 functools 设置不变的变量和一个空列表来捕获结果并使用 unique() 获取唯一键值列表。

partialA = functools.partial(taska, data=pgdf, key=VID, date=PDATE)
resultList = []
vidList = list(pgdf['VESSEL_ID'].unique())

如何将列表值传递给多核处理器并将每个进程的结果返回到列表中? 我用了...

with Pool(14) as pool:
    for results in pool.imap_unordered(partial_task, bwedf.iterrows()):
        ResultsList.append(results[0])

.iterrows() 起作用是因为在那个例子中我使用的是数据框,对于简单列表是否有类似的方法?

【问题讨论】:

    标签: python list multiprocessing


    【解决方案1】:

    您只需传递列表本身。

    with Pool(14) as pool:
        for results in pool.imap_unordered(partial_task, vidList):
            ResultsList.append(results[0])
    

    解释:imap 需要一个可迭代的,列表和df.iterrows 都是可迭代的......特别是任何你可以放在 for 循环中的东西都是可迭代的,即:

    for i in iterable:
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多