2017-04-06 15 views
-2

私はリストをとり、ngrams(ここではn = 2)のリストを返す関数を持っています。実行時間を短縮できるように、この関数をどのように並列化できますか?Pythonで関数を1つの引数で並列化するにはどうすればよいですか?

私はこれを試していますが、動作していません。 data_listは文字列のリストです。

import multiprocessing 
from multiprocessing.dummy import Pool 
from collections import OrderedDict 

grams_list = [] 
data_list = ["Hello, I am learning Python", 
      "Python is a very Powerful language", 
      "And Learning python is easy" ] 




def ngrams(input, n): 
    input = input.split(' ') 
    output = []  
    for i in range(len(input) - n + 1): 
     output.append(input[i:i + n]) 
    return output 

def generating_grams_list(data_list): 
    for j in range(0, len(data_list)): 
     grams = [' '.join(x) for x in ngrams(data_list[j], 2)] # Creating ngrams 
     grams_list.append(list(OrderedDict.fromkeys(grams))) # removing duplicates 
     # print "Creating ngrams list for each data string ", j 
    return grams_list 


if __name__ == '__main__': 
    pool = Pool(multiprocessing.cpu_count()) 
    results = pool.map(generating_grams_list, data_list) 
    pool.close() 
    pool.join() 

    for result in results: 
     print("result", result) 
+0

正確には動作しません。エラーはありますか?結果は期待通りではありませんか? 'dummy'モジュールを使うと、並列化ができなくなります。並行処理は並列処理と同じではありません – karlson

+0

@karlson結果は期待どおりではありません – sahil

+1

結果が何であるか、期待したことで質問を拡張してみませんか? – karlson

答えて

0

それはスレッドではなく、プロセス間で作業を分散するよう、あなたのプログラムの期間を短縮しませんmultiprocessing.dummyモジュールとまず第一に、。つまり、計算はまだ1つのプロセッサのみで実行されます。並行性と並列性の違いについては、例えばthis question and answer

を参照してください。実際の並列化を行うには、複数のプロセス間で作業を分散する必要があります。代わりにprocess poolを使用してください。 (私は右推測している場合は、正確にあなたの問題が何であるか言ってなかったので、)あなたの実際の問題に対処するために

おそらくdata_listではなく、リストの文字列のリストのリストになりたいです弦のコードがそのままで(すなわち、data_listgrams_listが実際に定義されていた場合)、generating_grams_listの呼び出しごとに1つの文字列を送信します。これはforループが意味をなさないあなたは文字をループしているだろう)。

注:パターンfor j in range(len(x)): func(x[j])は、for j, item in enumerate(x): func(item)と表記するとよいでしょう。

関連する問題