2017-05-20 5 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)はPythonでmultiprocessingモジュールはUnixとWindowsの両方に互換性があるとリモートとローカルの同時実行を提供しています

+1

と並列で、あなたは意味:マルチプロセッシング? – adelineu

+2

より迅速かつ高品質な回答を得るには、問題を詳細に説明することが重要です。あなたは_ "私はjoblibをforループを通してループすることができません"と書いていますが、 'joblib'はあなたが提供したコードのどこにもありません。だからあなたが試したことを私たちに見せてくれないなら、あなたが間違っていることを特定することはできません。また、あなたはそれを働かせることができないということは何を意味しますか?間違った結果をもたらすか(その場合、結果は何か)、エラーを作成していますか(その場合はどのようなエラーですか?)または 'joblib'がどのように動作するかについてのあなたの質問ですか? –

+0

あなたの質問が 'joblib 'にどう関係しているのかは不明です。また、 'for'ループでやっていることは、Pythonの組み込み並列処理ライブラリ' multiprocessing'と 'threading'のどちらからでも利益を得ることはできません**計算上の制約であり、グローバル( 'tfDict')。 – martineau

答えて

0

実行されwordDictにわたり反復のタスクを分割します。 Global Interpreter Lockはスレッドの代わりにサブプロセスを使用します。プロセスは、 'Process'オブジェクトを作成してからstart()メソッドを呼び出すことによって生成されます。プロセスはthreading.ThreadのAPIに従います。

以下の例は、forループを持つ2つの異なる関数を並列に実行して、それぞれのプロセスを作成する方法を示しています。興味深いことに、それぞれは独自のアドレス空間(仮想メモリ)を処理します。したがって、プログラム変数はプロセス間で共有されません。これを説明するために、2つのグローバル変数を作成し、それらをローカル変数で更新するときに取るべき反対の値に設定しました。あなたが見ることができるように、彼らは反対にとどまり、更新しません。 IPC、プロセス間通信、技術を使用して、2つのプロセス間でデータを共有できます。

コード

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ちょっとmartineau、私はより良い説明を提供するために私の答えを更新しました。 –

+0

あなたの変更は改善されています。少なくとも2つの別々の関数は両方とも 'for'ループを含んでいます。それらのそれぞれは、依然としてOPの質問の 'for'ループとは大きく異なり、メインプロセスとサブプロセスの間で共有されているものを更新していないので、あなたの答えがどれほど助けになるかは不明です。公正であるためには、質問自体は、達成したいことを正確に曖昧にしています。 – martineau

関連する問題