为什么pool.map()和map()返回不同的结果?

Surtr

我有以下程序:

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。

马丁·彼得斯(Martijn Pieters)

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么map_async()不需要pool.close()和pool.join()?

来自分类Dev

为什么map_async()不需要pool.close()和pool.join()?

来自分类Dev

Pool.map-为什么工作进程不会更早崩溃?

来自分类Dev

为什么我的 map() 调用没有返回预期的结果?

来自分类Dev

为什么mean()和mean(aggregate())返回不同的结果?

来自分类Dev

为什么checkPermission和has_permission返回不同的结果?

来自分类Dev

为什么.setUTCFullYear()和.setUTCMonth()返回不同的结果

来自分类Dev

为什么to_char和to_date返回不同的结果

来自分类Dev

为什么mean()和mean(aggregate())返回不同的结果?

来自分类Dev

为什么Virtuoso SPARQL端点和Jena返回的结果不同?

来自分类Dev

Scala:为什么可变Map和不可变Map在作为键的同一个自定义类实例上有不同的结果?

来自分类Dev

为什么strpos返回不同的结果?

来自分类Dev

为什么gethostbyaddr()返回不同的结果?

来自分类Dev

为什么mysql查询返回不同的结果?

来自分类Dev

为什么Dig返回不同的结果

来自分类Dev

为什么bcrypt总是返回不同的结果?

来自分类Dev

为什么(返回)和返回不同?

来自分类Dev

为什么在字符串数组上使用Array.map(parseInt)会产生不同的结果

来自分类Dev

为什么指定Map的初始容量会导致后续序列化产生不同的结果?

来自分类Dev

为什么 multiprocessing.Pool 和 multiprocessing.Process 在 Linux 中的表现如此不同

来自分类Dev

为什么for和while循环的结果不同?

来自分类Dev

为什么cpu和gpu的结果不同?

来自分类Dev

为什么Scipy的ndimage.map_coordinates对于某些数组不返回任何值或错误的结果?

来自分类Dev

为什么Map withDefaultValue返回Option = None

来自分类Dev

为什么在Python和Java中按位左移返回不同的结果?

来自分类Dev

为什么rbind()和do.call(rbind,)返回不同的结果?

来自分类Dev

为什么sklearn LatentDirichletAllocation的fit和partial_fit返回不同的结果?

来自分类Dev

为什么data.table :: B [A]和plyr :: join(A,B)返回不同的结果?

来自分类Dev

为什么np.std()和ivot_table(aggfunc = np.std)返回不同的结果

Related 相关文章

  1. 1

    为什么map_async()不需要pool.close()和pool.join()?

  2. 2

    为什么map_async()不需要pool.close()和pool.join()?

  3. 3

    Pool.map-为什么工作进程不会更早崩溃?

  4. 4

    为什么我的 map() 调用没有返回预期的结果?

  5. 5

    为什么mean()和mean(aggregate())返回不同的结果?

  6. 6

    为什么checkPermission和has_permission返回不同的结果?

  7. 7

    为什么.setUTCFullYear()和.setUTCMonth()返回不同的结果

  8. 8

    为什么to_char和to_date返回不同的结果

  9. 9

    为什么mean()和mean(aggregate())返回不同的结果?

  10. 10

    为什么Virtuoso SPARQL端点和Jena返回的结果不同?

  11. 11

    Scala:为什么可变Map和不可变Map在作为键的同一个自定义类实例上有不同的结果?

  12. 12

    为什么strpos返回不同的结果?

  13. 13

    为什么gethostbyaddr()返回不同的结果?

  14. 14

    为什么mysql查询返回不同的结果?

  15. 15

    为什么Dig返回不同的结果

  16. 16

    为什么bcrypt总是返回不同的结果?

  17. 17

    为什么(返回)和返回不同?

  18. 18

    为什么在字符串数组上使用Array.map(parseInt)会产生不同的结果

  19. 19

    为什么指定Map的初始容量会导致后续序列化产生不同的结果?

  20. 20

    为什么 multiprocessing.Pool 和 multiprocessing.Process 在 Linux 中的表现如此不同

  21. 21

    为什么for和while循环的结果不同?

  22. 22

    为什么cpu和gpu的结果不同?

  23. 23

    为什么Scipy的ndimage.map_coordinates对于某些数组不返回任何值或错误的结果?

  24. 24

    为什么Map withDefaultValue返回Option = None

  25. 25

    为什么在Python和Java中按位左移返回不同的结果?

  26. 26

    为什么rbind()和do.call(rbind,)返回不同的结果?

  27. 27

    为什么sklearn LatentDirichletAllocation的fit和partial_fit返回不同的结果?

  28. 28

    为什么data.table :: B [A]和plyr :: join(A,B)返回不同的结果?

  29. 29

    为什么np.std()和ivot_table(aggfunc = np.std)返回不同的结果

热门标签

归档