2017-04-06 31 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)

相关问题