Как Python процесс / карта потоков работает в Windows? Почему поток работает быстрее, чем процесс? - PullRequest
1 голос
/ 02 апреля 2019

Я пытаюсь найти более быстрый способ запуска 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)

Запуск на Win7-4 Real Core-I5-4700 с python 3.6.Вот вывод:

Ways | Workerjob | Process Num, показанный в taskmgr | Загрузка процессора во время работы | Стоимость времени

2threads | numpy | 1 process | 100% | 9s

2threads | sklearn | 1 процесс | 100% | 35s

2process | numpy | 3 процесса | 100% | 36s

2process | sklearn | 3 процесса | 100% | 77s

Почему процесс стоит больше времени?Как найти лучший способ снизить временные затраты и в полной мере использовать многоядерную ОС?

1 Ответ

0 голосов
/ 12 апреля 2019

OK. У меня есть его. Для тех модулей, которые могут выпускать GIL, как numpy, использование потокового бэкэнда сэкономит время, уменьшив стоимость копирования объекта Np из основного процесса в подпроцесс.

...