我试图找到一种更快的方式来运行numpy / sklearn来对数据列表执行某些任务。我得到一些建议我在重型数据计算工作中使用进程而不是线程的书。在执行此操作时,我发现线程的运行速度比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上运行。 输出如下:
方法| Workerjob | taskmgr中显示的进程数|工作时的CPU负载|时间成本
2threads | numpy | 1个进程| 100%| 9s
2个线程| sklearn | 1个进程| 100%| 35s
2个进程| numpy | 3个进程| 100%| 36s
2个进程| sklearn | 3个进程| 100%| 77s
为什么流程会花费更多时间? 如何找到降低时间成本并充分利用多核OS的更好方法?
答案 0 :(得分:0)
好。 我知道了 对于像numpy这样可以释放GIL的模块,使用线程后端将通过减少从主进程到子进程的Np对象复制成本来节省时间。