python - python进程/线程映射在Windows中如何工作?为什么线程比进程运行得更快?

标签 python multithreading process pool

我正在尝试找到一种更快的方法来运行 numpy/sklearn 以在数据列表上执行某些任务。我有一些书建议我在繁重的数据计算工作中使用进程而不是线程。在执行此操作时,我发现线程比进程运行得更快。这是为什么?我应该选择哪种方式?

# -*- 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负载|时间成本

2线程|numpy |1个进程|100%|9s

2线程|sklearn|1个进程|100%|35s

2进程|numpy |3进程|100%|36s

2进程|sklearn|3进程|100%|77s

为什么流程会花费更多时间? 如何找到更好的方法来降低时间成本并充分利用多核操作系统?

最佳答案

好的。 我已经明白了。 对于像numpy这样可以释放GIL的模块,使用Thread后端将通过减少从主进程到子进程的Np对象复制成本来节省时间。

关于python - python进程/线程映射在Windows中如何工作?为什么线程比进程运行得更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55474552/

相关文章:

windows - 读取正在运行的进程的文件版本

silverlight - 您可以使用 Silverlight 启动外部进程吗?

python - 如何使用break、continue和return语句来避免Python中的深度嵌套代码?

python - 将行与匹配的键组合起来

c# - 崩溃后从同一位置启动线程

java - 检查线程池是否有等待执行的任务?

python - SQLAlchemy 和 DDD

python - Windows 10 上的最新蚊子未运行

java - 如何关闭来自不同线程的线程?

c# - 为什么 Process.Start 会产生 ANSI 转义码