我正在尝试学习如何使用 Python 的多处理包,但我不明白 和 之间的map区别imap。
map返回一个实际的数组或集合,而imap返回一个数组或集合的迭代器的区别是什么?我什么时候会使用其中一个?
另外,我不明白 chunksize 参数是什么。这是传递给每个进程的值的数量吗?
我正在尝试学习如何使用 Python 的多处理包,但我不明白 和 之间的map区别imap。
map返回一个实际的数组或集合,而imap返回一个数组或集合的迭代器的区别是什么?我什么时候会使用其中一个?
另外,我不明白 chunksize 参数是什么。这是传递给每个进程的值的数量吗?
这就是区别。您可能使用 imap 而不是 map 的一个原因是,如果您想开始处理前几个结果而不等待计算其余结果。map 在返回之前等待每个结果。
至于 chunksize,有时分配大量工作会更有效,因为每次工作人员请求更多工作时,都会产生 IPC 和同步开销。
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 将使可迭代的可拆分为指定大小(近似)的块,并且每个块都作为单独的任务提交。
使用 imap,分叉调用是并行完成的,而不是一个接一个的顺序。例如,在下面,您要点击三个交易所来获取订单簿。imap.pool 调用不是按顺序点击交易所 1,然后是交易所 2,然后是交易所 3,而是非阻塞式的,并且在您调用时直接转到所有三个交易所以获取订单簿。
from pathos.multiprocessing import ProcessingPool as Pool
pool = Pool().imap
self.pool(self.getOrderBook, Exchanges, Tickers)