如何在Python中将函数与一个参数并行化?

时间:2017-04-06 06:42:19

标签: python

我有一个函数,它接受一个列表并返回ngrams列表(这里n = 2)。如何并行化此功能以减少运行时间?

我正在尝试这个,但它没有用。 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)

1 个答案:

答案 0 :(得分: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)