了解concurrent.futures.Executor.map()

时间:2017-01-27 21:23:29

标签: python python-3.x concurrent.futures

我尝试使用进程和concurrent.futures并行化一些Python代码。看起来我可以通过submitting调用多次并行执行函数,然后在期货上调用Future.result(),或者使用Executor.map()。 我想知道后者是否只是前者的语法糖,如果在性能方面存在任何差异。从文档中可以立即看出它。

1 个答案:

答案 0 :(得分:0)

它允许您同时执行多次函数而不是真正的并行执行。

性能方面,我最近发现ProcessPoolExecutor.submit()ProcessPoolExecutor.map()消耗了相同的计算时间来完成相同的任务。注意:.submit()会返回一个未来对象(让我们称之为f),您需要使用它的f.result选项才能看到它的结果。另一方面,.map()直接返回迭代器。

使用排序方法将结果转换为有序列表时,我发现在某些情况下,整个.map()代码的计算时间可能比整个.submit()代码快。

使用list方法将结果转换为无序列表时,整个.submit().map()代码的计算时间是相同的。而且,这些代码比使用排序方法的代码执行得更快。

您可以在answer中阅读详细信息。在那里,我也分享了我的代码,你可以看到它们是如何工作的。我希望他们对你有所帮助。

我没有使用ThreadPoolExecutor因此我无法详细评论。但是,我已经读过它们的实现方式与ProcessPoolExecutor相同,它们更适合用于I / O绑定任务而不是CPU绑定任务。您需要指定 max_workers 参数,即最大线程数,而在ProcessPoolExecutor max_workers中是一个可选参数,默认为由os.cpu_count()返回的CPU。