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

我试图找到一种更快的方式来运行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?

参考方案

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

Python sqlite3数据库已锁定 - python

我在Windows上使用Python 3和sqlite3。我正在开发一个使用数据库存储联系人的小型应用程序。我注意到,如果应用程序被强制关闭(通过错误或通过任务管理器结束),则会收到sqlite3错误(sqlite3.OperationalError:数据库已锁定)。我想这是因为在应用程序关闭之前,我没有正确关闭数据库连接。我已经试过了: connectio…

我运行带有multiprocessing.Pool()的python代码,所有进程一开始运行良好,但是所有进程都在几个小时后陷入睡眠状态 - python

我使用python 2.7和带有multiprocessing.Pool()的anaconda2运行python代码,并且使用了10个CPU工人。该代码从同一文件读取输入(仅以读取模式打开),并在某些处理后输出一些字符串,并且所有输出均被重定向到bash中带有'>'的同一文件。该代码在centos服务器上运行,并在其中运行许多其他进程。最初,所有过程运…

python-docx应该在空单元格已满时返回空单元格 - python

我试图遍历文档中的所有表并从中提取文本。作为中间步骤,我只是尝试将文本打印到控制台。我在类似的帖子中已经看过scanny提供的其他代码,但是由于某种原因,它并没有提供我正在解析的文档的预期输出可以在https://www.ontario.ca/laws/regulation/140300中找到该文档from docx import Document from…

Python:集群作业管理 - python

我在具有两个阶段的计算群集(Slurm)上运行python脚本,它们是顺序的。我编写了两个python脚本,一个用于阶段1,另一个用于阶段2。每天早上,我检查所有第1阶段的工作是否都以视觉方式完成。只有这样,我才开始第二阶段。通过在单个python脚本中组合所有阶段和作业管理,是否有一种更优雅/自动化的方法?我如何知道工作是否完成?工作流程类似于以下内容:w…

Python-Excel导出 - python

我有以下代码:import pandas as pd import requests from bs4 import BeautifulSoup res = requests.get("https://www.bankier.pl/gielda/notowania/akcje") soup = BeautifulSoup(res.cont…