54

我正在尝试学习如何使用 Python 的多处理包,但我不明白 和 之间的map区别imap

map返回一个实际的数组或集合,而imap返回一个数组或集合的迭代器的区别是什么?我什么时候会使用其中一个?

另外,我不明白 chunksize 参数是什么。这是传递给每个进程的值的数量吗?

4

3 回答 3

48

这就是区别。您可能使用 imap 而不是 map 的一个原因是,如果您想开始处理前几个结果而不等待计算其余结果。map 在返回之前等待每个结果。

至于 chunksize,有时分配大量工作会更有效,因为每次工作人员请求更多工作时,都会产生 IPC 和同步开销。

于 2012-07-05T05:07:00.333 回答
4

imap 来自 itertools 模块,该模块用于 python 中的快速和内存效率。Map 将返回列表,其中 imap返回为每次迭代生成值的对象(在 python 2.7 中)。下面的代码块将清除差异。

地图返回列表可以直接打印

 from itertools import *
    from math import *

    integers = [1,2,3,4,5]
    sqr_ints = map(sqrt, integers)
    print (sqr_ints)

imap 返回转换为列表并打印的对象。

from itertools import *
from math import *

integers = [1,2,3,4,5]
sqr_ints = imap(sqrt, integers)
print list(sqr_ints)

Chunksize 将使可迭代的可拆分为指定大小(近似)的块,并且每个块都作为单独的任务提交。

于 2017-07-08T17:40:59.190 回答
3

使用 imap,分叉调用是并行完成的,而不是一个接一个的顺序。例如,在下面,您要点击三个交易所来获取订单簿。imap.pool 调用不是按顺序点击交易所 1,然后是交易所 2,然后是交易所 3,而是非阻塞式的,并且在您调用时直接转到所有三个交易所以获取订单簿。

from pathos.multiprocessing import ProcessingPool as Pool
pool = Pool().imap
self.pool(self.getOrderBook, Exchanges, Tickers)
于 2018-08-02T01:30:32.280 回答