我有以下程序:
import string
import itertools
import multiprocessing as mp
def test(word_list):
return list(map(lambda xy: (xy[0], len(list(xy[1]))),
itertools.groupby(sorted(word_list))))
def f(x):
return (x[0], len(list(x[1])))
def test_parallel(word_list):
w = mp.cpu_count()
pool = mp.Pool(w)
return (pool.map(f, itertools.groupby(sorted(word_list))))
def main():
test_list = ["test", "test", "test", "this", "this", "that"]
print(test(test_list))
print(test_parallel(test_list))
return
if __name__ == "__main__":
main()
输出为:
[('test', 3), ('that', 1), ('this', 2)]
[('test', 0), ('that', 0), ('this', 1)]
第一行是预期的正确结果。我的问题是,为什么pool.map()不返回与map()相同的结果?
另外,我知道6项列表并不是进行多处理的完美案例。这只是在大型应用程序中实现时遇到的问题的演示。
我正在使用Python 3.5.1。
groupby()
返回迭代每组,而这些都是不独立。从在基础迭代通过你不能独立地迭代过这些组并联; 当您访问下一个群组时,任何先前的群组都会过早结束。
pool.map()
将尝试读取所有groupby()
迭代器结果,以将这些结果发送到单独的函数;仅尝试获得第二组将导致第一组为空。
您可以看到相同的结果,而无需pool.map()
简单地通过迭代到下一个结果groupby()
:
>>> from itertools import groupby
>>> word_list = ["test", "test", "test", "this", "this", "that"]
>>> iterator = groupby(sorted(word_list))
>>> first = next(iterator)
>>> next(first[1])
'test'
>>> second = next(iterator)
>>> list(first[1])
[]
第一组的其余部分为“空”,因为已请求第二组。
明确记录在案:
因为源是共享的,所以当
groupby()
对象前进时,上一个组将不再可见。
您必须先将每个组“具体化”,然后再发送给函数:
return pool.map(lambda kg: f((k[0], list(kg[1]))), itertools.groupby(sorted(word_list)))
或者
return pool.map(f, (
(key, list(group)) for key, group in itertools.groupby(sorted(word_list))))
生成器表达式在pool.map()
迭代时负责实现。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句