将CPU密集型功能修改为并行功能

时间:2014-11-20 01:42:07

标签: python parallel-processing

我有一个函数,我从stdin读取行并使用itertools.groupby对行进行分组,然后进行一些处理。我的代码如下所示:

from itertools import groupby
from operator import itemgetter

def func(lines):
    for key, group in groupby(lines, key=itemgetter(0)):
        lst = list(group)
        results = my_cpu_intensive_function(lst)

        # send results to stdout for further processing
        print(results)

def main():
    # a generator holding lists of data
    lines = (line.strip().split('\t') for line in sys.stdin)
    func(lines)

一切都按照我的要求运行,但是,my_cpu_intensive_function()非常耗费CPU。如何并行化此功能以加快我的代码?我在看multiprocessing.Pool(),但我无法弄清楚如何使用它,或者它是否适合这项工作。

1 个答案:

答案 0 :(得分:1)

多处理绝对是一个很好的模块。我没有亲自使用Pool(我通常只使用Process()生成进程),但在文档中看起来很简单。

https://docs.python.org/2/library/multiprocessing.html

只需列出工作流程的输入,然后使用pool.map()

from itertools import groupby
from operator import itemgetter
from multiprocessing import pool

def func(lines):
    groups = []
    for key, group in groupby(lines, key=itemgetter(0)):
        groups.append( list(group) )

    pool = Pool(processes=len(groups))

    results_lst = pool.map( my_cpu_intensive_function, groups )

    # send results to stdout for further processing
    print(results)

def main():
    # a generator holding lists of data
    lines = (line.strip().split('\t') for line in sys.stdin)
    func(lines)

虽然如果您有很多组,但您可能需要注意产生的子进程数。也许将len(groups)替换为max( len(groups), 16)左右是一个好主意。你可以通过this question找到一个很好的价值。