python - 在 Python 中并行化一个简单的循环并使用 concurrent.futures 获得结果
问题描述
假设我有无法在列表上运行的复杂功能:
import concurrent.futures
import random
import numpy as np
inputData = random.sample(range(60000, 1000000), 50)
def complicated_function(x):
"""complicated stuff"""
return x**x
我可以通过这种方式直接在循环中处理(这就是我希望代码末尾的结果,如果可能的话,使用相同的顺序):
#without parallelization
processedData = [complicated_function(x) for x in inputData]
对于并行处理,我查看教程并编写了以下代码:
#with parallelization
processedData2 = []
with concurrent.futures.ThreadPoolExecutor() as e:
fut = [e.submit(complicated_function, inputData[i]) for i in range(len(inputData))]
for r in concurrent.futures.as_completed(fut):
processedData2.append(r.result())
问题是,在我的系统监视器上观看时,只有一个核心在运行..所以显然这不是我需要的工作......
非常感谢您的帮助!
解决方案
这是因为您正在使用线程,当您使用线程时,pythons 全局解释器锁实际上并没有跨多个内核并行运行任务。
相反,您可以使用多处理..就像 ThreadPoolExecutor 一样,有一个 ProcessPoolExecutor 将确保使用多个核心。
推荐阅读
- h2o - h2o 的时间差异(强化学习)
- javascript - 如何按日期创建排序对象
- r - 是否有 dplyr 工作流程来获取非标准文件名并强制它们具有结构?
- sql - 在视图上创建聚集索引后查询视图仍会产生相同的查询计划
- mysql - 带有别名的 Sequelize 属性似乎未定义
- r - 在 R 中使用 Equamax 旋转复制 SPSS PCA 的结果
- ag-grid - 在 rowData 更新后是否有检测网格何时准备就绪的事件?
- parsing - 移位/减少与歧义语法的冲突
- reactjs - React Hooks:以原子方式更新多个钩子状态
- javascript - Medium-editor:如何应用多个标签包装器?