我有一个函数,它调用一个自定义函数来比较数据框中的行并计算一些统计数据。make_breakpts需要一个数据框(data)、一个键(唯一标识符)和一个日期字段(date)来完成它的工作。我可以运行它并等待很长时间,它将遍历整个数据框并输出通过比较序列(在本例中为日期)计算的统计数据框。我有一个所有唯一键值的列表,我想把它传递给多处理,这样列表中的每个项都用于子集输入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()工作,因为在那个例子中,我使用的是一个数据框架,是否有一个简单的列表类似的方法?
你只需要传递列表本身。
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: