我正在尝试学习如何使用 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)