簡體   English   中英

python進程/線程映射在Windows中如何工作?為什么線程比進程更快?

[英]How is python process/thread map working in windows?Why thread works faster than process?

我試圖找到一種更快的方式來運行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?

好。 我知道了 對於那些可以釋放GIL的模塊(例如numpy),使用線程后端將通過減少從主進程到子進程的Np對象復制成本來節省時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM