簡體   English   中英

如何在python for循環中應用多處理技術?

[英]How to apply multiprocessing technique in python for-loop?

我有一長串用戶(大約 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 然后我應該將每個循環輸入一個進程。 但問題是我如何知道某個進程中的任務已經完成,以便可以開始新的循環? 你能幫我解決這個問題嗎? 提前謝謝你!

您可以使用multiprocessing.Pool ,它提供方法map ,將進程池映射到給定的可迭代對象。 下面是一些示例代碼:

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)

首先,我不建議對這么小的數據使用多處理。 尤其是當您使用數據框時。 因為數據框有它自己的很多功能,可以在很多方面幫助你。 你只需要編寫適當的循環。

使用: multiprocessing.Pool

只需將用戶列表作為 iterator(process_size=list_of_user) 傳遞給 pool.map() 。 你只需要稍微調整一下就可以創建你的迭代器。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM