2017-04-06 63 views
-2

我有一個函數,它接受一個列表並返回列表ngrams(這裏n = 2)。我該如何平行化這個功能,以減少運行時間?如何在Python中使用一個參數並行化一個函數?

我正在嘗試這個,但它不工作。 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模塊,因爲它跨線程,而不是進程工作分配,你也不會降低你的程序的時間。這意味着計算仍然只能在一個處理器上運行。對於併發和並行之間的差異例如見this question and answer

要獲得真正的並行化需要跨越多發過程,例如傳播工作改爲使用process pool

爲了解決您的實際問題(如果我猜對的,因爲你並沒有完全說你的問題是什麼):

你可能想data_list是字符串,而不是一個名單列表的列表的字符串。使用代碼(即,如果data_listgrams_list實際上已定義),您將向每個調用generating_grams_list發送一個字符串,這很可能不是您想要的,因爲for循環沒有任何意義(你會循環字符)。

附註:for j in range(len(x)): func(x[j])最好寫成for j, item in enumerate(x): func(item)

相關問題