我有一个函数,我从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()
,但我无法弄清楚如何使用它,或者它是否适合这项工作。
答案 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找到一个很好的价值。