如何在python for循环中应用多处理技术?

时间:2016-10-03 11:37:31

标签: python multiprocessing

我有一长串用户(约200,000)和相应的数据框df及其属性。现在我想写一个for循环来测量用户的成对相似性。代码如下:

df2record = pd.DataFrame(columns=['u1', 'u2', 'sim'])
for u1 in reversed(user_list):
    for u2 in reversed(list(range(1, u1))):
        sim = measure_sim(df[u1], df[u2]))
        if sim < 0.6:
            continue
        else:
            df2record = df2record.append(pd.Series([u1, u2, sim], index=['u1', 'u2', 'sim']), ignore_index=True)

现在我想用多处理来运行这个for循环,我已经阅读了一些教程。但我仍然不知道如何正确处理它。似乎我应该首先设置合理数量的流程,例如6。然后我应该将每个循环输入一个进程。但问题是我怎么知道某个过程中的任务已经完成,以便可以开始新的循环?你能帮帮我吗?提前谢谢你!

2 个答案:

答案 0 :(得分:1)

您可以使用multiprocessing.Pool提供方法map,该方法在给定的iterable上映射进程池。这是一些示例代码:

def pairGen():
    for u1 in reversed(user_list):
        for u2 in reversed(list(range(1, u1))):
            yield (u1, u2)

def processFun(pair):
    u1, u2 = pair
    sim = measure_sim(df[u1], df[u2]))
    if sim < 0.6:
        return None
    else:
        return pd.Series([u1, u2, sim], index=['u1', 'u2', 'sim'])

def main():
    with multiprocessing.Pool(processes=6) as pool:
       vals = pool.map(processFun, pairGen())

    df2record = pd.DataFrame(columns=['u1', 'u2', 'sim'])
    for v in vals:
       if vals != None:
           df2record = df2record.append(v, ignore_index=True)

答案 1 :(得分:0)

首先,我不建议对这么小的数据使用多处理。尤其是在使用数据框时。因为数据框有它自己的批次功能,可以在很多方面帮助你。你只需要编写适当的循环。

使用:multiprocessing.Pool

只需将用户列表作为迭代器(process_size = list_of_user)传递给pool.map()。你只需要稍微调整一下就可以创建你的迭代器。

from multiprocessing import Pool
with Pool() as pool:
     pool = multiprocessing.Pool(processes=6)
     pool.map(function, iterator)