2017-05-20 165 views
-2

我有一些代碼循環通過字典,其中的關鍵是一個字,它將術語頻率分配給該鍵。 tok是來自某些文本的令牌列表。創建一個平行'for'循環?

def calculateTF(wordDict, tok): 
    tfDict = {} 
    termCount = len(tok) 
    for word, count in wordDict.iteritems(): 
     tfDict[word] = count/float(termCount) 
    return tfDict 

我想分手了迭代的任務交給地方tfDict[word] = count/float(termCount)執行

+1

,與平行你的意思是:多處理? – adelineu

+2

爲了更快速地獲得更高質量的答案,詳細解釋問題非常重要。你寫了_「我無法讓joblib循環訪問for循環」,但是'joblib'不在你提供的代碼中。所以我們不能確定你做錯了什麼,如果你沒有告訴我們你嘗試過什麼。此外,這是什麼意思,你不能得到它的工作?它是否提供了錯誤的結果(在這種情況下,結果是什麼?)還是會產生錯誤(在這種情況下,哪些錯誤?)。或者你的問題是關於'joblib'如何工作的? –

+0

目前還不清楚你的問題與joblib的關係。另外,你在'for'循環中做的事情可能不會受益於Python的內置並行處理庫,多處理器和線程技術,因爲它是計算綁定的,並且正在更新全局('tfDict')。 – martineau

回答

0

multiprocessing模塊Python是Unix和Windows兼容,並提供遠程和本地併發性wordDict。 Global Interpreter Lock使用子進程而不是線程。通過創建一個'Process'對象,然後調用其方法start()來生成進程。該過程遵循threading.Thread的API。

下面的例子演示瞭如何通過爲每個函數創建一個進程來並行執行兩個不同的函數,每個函數都有一個for循環。作爲一個有趣的筆記,每個進程都有自己的地址空間(虛擬內存)。因此,程序變量不會在進程之間共享。爲了說明這一點,我創建了兩個全局變量,並將它們設置爲它們在由局部變量更新時應該採用的相反值。正如你所看到的,他們保持對立,不更新。您可以使用IPC,進程間通信技術在兩個進程之間共享數據。

代碼

import multiprocessing 

global_any = False 
global_all = True 

def calculate_any(number): 
    local_list_any = [1,2,3] 
    local_result_any = any(True if i == number else False for i in local_list_any) 
    global_any = local_result_any 
    print("This is the first result within a process: {}".format(local_result_any)) 

def calculate_all(number): 
    local_list_all = [1,2,3] 
    local_result_all = all(True if i == number else False for i in local_list_all) 
    global_all = local_result_all 
    print("This is the second result within a process: {}".format(local_result_all)) 


if __name__ == "__main__": 
    number = 2 
    p1 = multiprocessing.Process(target = calculate_any, args = (number,)) 
    p2 = multiprocessing.Process(target = calculate_all, args = (number,)) 

    p1.start() 
    p2.start() 

    p1.join() 
    p2.join() 

    print('The result of the ANY global variable: {}'.format(global_any)) 
    print('The result of the ALL global variable: {}'.format(global_all)) 

結果

The result of the ANY global variable: False 
The result of the ALL global variable: True 
This is the first result within a process: True 
This is the second result within a process: False 

參考

https://docs.python.org/2/library/multiprocessing.html

https://pymotw.com/2/multiprocessing/basics.html

https://www.youtube.com/watch?v=Lu5LrKh1Zno

+0

這是如何說明做一個並行'for'循環? – martineau

+0

@martineau嘿馬蒂諾,我更新了我的答案,以提供更好的解釋。 –

+0

你的改變是一個改進 - 至少現在兩個單獨的函數都包含'for'循環。它們中的每一個與OP的問題中的for循環都是非常不同的,並且沒有更新主進程和子進程之間共享的任何東西 - 所以我不清楚你的答案對他們有多大的幫助。公平地說,這個問題本身對於他們想要完成的事情非常模糊。 – martineau