[英]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.