python - python 进程/线程映射如何在 Windows 中工作?为什么线程比进程工作得快?
问题描述
我正在尝试找到一种更快的方法来运行 numpy/sklearn 以在数据列表上执行某些任务。我有一些书建议我在重数据计算工作中使用 Process 而不是 Thread。这样做时,我发现线程比 Process 运行得更快。这是为什么?我应该选择哪种方式?
# -*- coding: utf-8 -*-
"""
Created on Tue Apr 2 10:20:19 2019
@author: Simon
"""
import time
import numpy as np
from sklearn import linear_model
from concurrent.futures import ProcessPoolExecutor as Pool
from concurrent.futures import ThreadPoolExecutor as Pool
xx, yy = np.meshgrid(np.linspace(0,10,1000), np.linspace(10,100,1000))
zz = 1.0 * xx + 3.5 * yy + np.random.randint(0,100,(1000,1000))
X, Z = np.column_stack((xx.flatten(),yy.flatten())), zz.flatten()
regr = linear_model.LinearRegression()
def regwork(t):
X=t[0]
Z=t[1]
regr.fit(X, Z)
a, b = regr.coef_, regr.intercept_
return a
def numpywork(t):
X=t[0]
Z=t[1]
for i in range(1):
r=np.sum(X,axis=1)+np.log(Z)
return np.sum(r)
if __name__=="__main__":
r=regx((X,Z))
rlist=[[X,Z]]*500
start=time.clock()
pool = Pool(max_workers=2)
results = pool.map(numpywork, rlist)
for ret in results:
print(ret)
print(time.clock()-start)
使用 python 3.6 在 Win7-4 Real Core-I5-4700 上运行。这是输出:
Ways|Workerjob|Process Num 在 taskmgr 中显示|工作时 Cpu 负载|时间成本
2threads|numpy |1 个进程|100%|9s
2threads|sklearn|1 个进程|100%|35s
2进程|numpy |3进程|100%|36s
2个进程|sklearn|3个进程|100%|77s
为什么流程花费更多时间?如何找到更好的方法来降低时间成本并充分利用多核操作系统?
解决方案
好的。我明白了。对于像 numpy 这样可以释放 GIL 的模块,使用 Thread 后端将通过减少从主进程到子进程的 Np 对象复制成本来节省时间。
推荐阅读
- reactjs - 使用从 API 返回的 JSON 来填充 React-Table 表组件使用的变量
- reactjs - 如何在 useEffect 中的操作调用后填充状态?
- python - 熊猫:从索引对应于另一列中的值的列中选择
- python - 关于训练/验证损失方面的模型比较
- r - 使用 R 中的 2 个条件匹配表
- javascript - 进入功能时取消角度8中的promise api请求
- java - 树dfs算法的空间复杂度
- asp.net-core - 如何最好地处理 FluentValidation 所需的数据获取
- sql - 在 SQL 中使用连接列创建视图 > 然后使用 Case 语句影响值
- flutter - 如何在flutter上使用信用卡Visa和Mastercard进行支付?