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