Python并行处理数据多进程/多线程,榨干你的CPU

2023-10-31

前言

  最近在公司实习,给整了个活,像是数学建模一样的数据分析的活,目标是在几个互相有关联的大表中找出满足某条件的那些业务,其中第一步就是把两个表拼起来,就叫它们A和B吧,省略拼表过程中需要的逻辑判断。

串行

  两个长为M和N的表,在判断中需要一个M*N级别的判断,也就是N2的复杂度,当M和N都很大时,比如3w,那还是得花点时间的,比如七八分钟。所以得想办法加速。

使用concurrent.futures的线程池

  既然是在一个py进程里干的活,那自然就想到能不能多开几个线程,比如12个,反正每个判断是独立的,把一个表尽量平均拆成12份,让每个线程去做那一份的判断,最后再把结果返回给主进程进行拼接。这里我先使用了Python的concurrent.futures的线程池来看看效果。
  concurrent.futures 是 Python 的一个模块,它提供了一个高级接口,用于异步执行可调用对象,也可以理解为并发。异步执行可以使用线程(使用 ThreadPoolExecutor)或单独的进程(使用 ProcessPoolExecutor)来执行。两者都实现了相同的接口,由抽象的 Executor 类定义 。

  一个大致的使用框架:

import pandas as pd
import concurrent.futures

def sub_process(data: list) -> list:
	res = []
	# 处理
	return res

df = pd.read_csv('large_data.csv')
num_threads = 12
chunk_size = len(df) // num_threads

results = []
with concurrent.futures.ThreadPoolExecutor(max_workers=num_threads) as executor:
    for i in range(num_threads):
        start = i * chunk_size
        end = (i + 1) * chunk_size if i < num_threads - 1 else len(df)
        data_chunk = df.iloc[start:end]
        future = executor.submit(sub_process, data_chunk)
        results.append(future)

final_result = []
for f in results:
    final_result.extend(f.result())

使用multiprocessing

  使用了上面这个后,效果并不好,CPU占用就没超过40%,肯定是那里出现了问题,查了一下可能是GIL锁的问题,它是一个互斥锁(mutex),用于防止多个本地线程同时执行 Python 字节码。这个锁主要是因为 CPython 的内存管理不是线程安全的,所以需要这个锁来保证线程安全。
  无奈,只能再尝试其他的,比如multiprocessing,既然不让我的多个线程同时执行,那我开多个进程总行了吧,无非就是多用点内存,多复制几个其他要用到的数据给进程。需要注意的是, 使用这个的话,在循环中启动进程时,没法接收到子进程处理后的结果返回值,所以需要在主进程中创建一个数据结构,让子进程执行完了把结果往里面放,完事儿再让主进程去接收,正好multiprocessing中就有队列的类,可以直接用。推荐进程数和CPU的超线程数一样。试过如果和物理核数一样的话,还是不能拉满CPU,总耗时也比不过设置为线程数。
  很喜欢看着CPU被拉满时任务管理器框框被占满的样子。

from multiprocessing import Process, Queue

def worker(pro_id, data_slice, q):
    result = [sum(data_slice)] * pro_id
    q.put((pro_id, result))

if __name__ == '__main__':
    data = list(range(100))
    num_worker = 12
    slice_size = len(data) // num_worker
    q = Queue()
    pool = []
    for i in range(num_worker):
        start = i * slice_size
        end = (i + 1) * slice_size if i < num_worker - 1 else len(data)
        data_slice = data[start:end]
        p = Process(target=worker, args=(i, data_slice, q))
        p.start()
        pool.append(p)
    result_list = []
    for _ in range(num_worker):
        result_list.append(q.get())
    for p in pool:
        p.join()
    # 如果不在意结果的顺序的话,可以不用排序,队列保存时也可去掉id项。
    result_list.sort(key=lambda x: x[0])
    final_result = [x[1] for x in result_list]
    print(final_result)

没了,主打一个短小精悍,浓缩的就是精华,希望能对你有所帮助

  其实如果要并发的任务只是纯计算的话,用上一个方法更加适合。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python并行处理数据多进程/多线程,榨干你的CPU 的相关文章

  • KFold 和 ShuffleSplit CV 有什么区别?

    看起来 KFold 每次迭代对象时都会生成相同的值 而 Shuffle Split 每次都会生成不同的索引 它是否正确 如果是这样 其中一个相对于另一个有什么用处 cv cross validation KFold 10 n folds 2
  • Python 在 chroot 中运行时出现错误

    我尝试在 chroot 中运行一些 Python 程序 但出现以下错误 Could not find platform independent libraries
  • 底图上的子图

    我有一张英国地图和 121 个地点 每个地点有 3 个值 我想绘制 121 个位置中每个位置的三个值的小条形图 目前 这些值绘制为markersize属性 看起来像这样 密集恐惧症情节 https i stack imgur com 5fv
  • 如何在 ReportLab 段落中插入回车符?

    有没有办法在 ReportLab 的段落中插入回车符 我试图将 n 连接到我的段落字符串 但这不起作用 Title Paragraph Title n Page myStyle 我想要这样做 因为我将名称放入单元格中 并且想要控制单元格中的
  • 字典中的列表,Python 中的循环

    我有以下代码 TYPES hotmail type hotmail lookup mixed dkim no signatures S Return Path email protected cdn cgi l email protecti
  • 使用 Scipy imsave 将 Numpy 数组保存到图像时保留未更改的数据

    使用 Scipy 保存二维 Numpy 数组 单个值 时toimage or imsave像素值与 Numpy 数组中的像素值不完全匹配 相反 在某些区域 主要是边缘 图像算法似乎使用某种插值 是否有一个选项可以停止插值并保留准确的数据 例
  • 在 Flask (WSGI) 中使用全局单例,我是否需要担心竞争条件? [复制]

    这个问题在这里已经有答案了 Flask 的 hello world 演示是 from flask import Flask app Flask name app route def hello return Hello World if n
  • 杂乱的扭曲连接在不干净的时尚中消失了。没有代理。已经尝试过标题

    我正在尝试抓取这个网站 https www5 apply2jobs com jupitermed ProfExt index cfm fuseaction mExternal searchJobs https www5 apply2jobs
  • 如何对这个 Flask 应用程序进行单元测试?

    我有一个 Flask 应用程序 它使用 Flask Restless 来提供 API 我刚刚写了一些身份验证来检查 如果消费者主机被识别 该请求包含一个哈希值 通过加密 POST 的请求内容和 GET 的 URL 以及秘密 API 密钥来计
  • Django - 电子邮件发送两次

    每当我使用如下所示的电子邮件设置从views py调用下面的方法时 电子邮件的两份副本都会发送给收件人 并且我收到如下所示的错误 def sendEmailBasic request msg EmailMessage Request Cal
  • 在Python中删除带有重音符号的字符串中的所有非字母字符

    我正在尝试使用 Python 3 7 从包含重音符号的字符串中删除所有非字母字符 空格除外 我尝试了以下方法 import re text 29 1981 4 2008 clean text re sub W d text print cl
  • 为什么“return self”返回 None ? [复制]

    这个问题在这里已经有答案了 我正在尝试获取链的顶部节点getTopParent 当我打印出来时self name 它确实打印出了父实例的名称 然而 当我回来时self 它返回 None 为什么是这样 class A def init sel
  • 如何强制 Y 轴仅使用整数

    我正在使用 matplotlib pyplot 模块绘制直方图 我想知道如何强制 y 轴标签仅显示整数 例如 0 1 2 3 等 而不显示小数 例如 0 0 5 1 1 5 2 等 我正在查看指导说明并怀疑答案就在附近matplotlib
  • Jupyter Notebook:没有名为 pandas 的模块

    我搜索了其他问题 但没有找到任何有帮助的内容 大多数只是建议您使用 conda 或 pip 安装 pandas 在我的 jupyter 笔记本中 我试图导入 pandas import pandas as pd 但我收到以下错误 Modul
  • 为什么 bot.get_channel() 会产生 NoneType?

    我正在制作一个 Discord 机器人来处理公告命令 当使用该命令时 我希望机器人在特定通道中发送一条消息 并向用户发送一条消息以表明该命令已发送 但是 我无法将消息发送到频道 我尝试了这段代码 import discord import
  • 从另一个 python 脚本获取返回信息

    我在 Linux 上 我有一个 python 脚本 我想从另一个 python 脚本调用它 我不想将其作为模块导入 为了一层安全性 现在为了学术练习 因为我想弄清楚这一点 我实际上想让一个脚本使用 os system 或另一个类似的函数 并
  • 最小硬币找零问题——回溯

    我正在尝试用最少数量的硬币解决硬币找零问题 采用回溯法 我实际上已经完成了它 但我想添加一些选项 按其单位打印硬币数量 而不仅仅是总数 这是我下面的Python代码 def minimum coins coin list change mi
  • 在 Python 的 Textmate 中突出显示尾随空格?

    我想做类似的事情this http remysharp com 2008 03 30 trailing white space in textmate Textmate 提示 这样当我在 Python 中编写代码时 尾随空白总是以某种方式突
  • SQLAlchemy:避免声明式样式类定义中的重复

    我正在使用 SQLAlchemy 并且我的对象模型中的许多类具有相同的两个属性 id 和 整数和主键 以及名称 字符串 我试图避免在每个类中声明它们 如下所示 class C1 declarative base id Column Inte
  • 从 pandas 数据框中绘制堆积条形图

    我有数据框 payout df head 10 复制以下 Excel 绘图的最简单 最智能和最快的方法是什么 我尝试过不同的方法 但无法让一切都到位 Thanks 如果您只想要一个堆积条形图 那么一种方法是使用循环来绘制数据框中的每一列 并

随机推荐

  • 众享比特董事长严挺:数字藏品在国内有三大发展趋势

    2022年11月2日 巴比特主办的温州元宇宙月系列活动之 数字藏品 虚拟人 元宇宙营销新策略 论坛在温州召开 众享比特董事长严挺 众享链网发起人严挺出席论坛并进行主题为 元宇宙在国内落地的一些实践分享 的演讲 温州元宇宙主题月秉承 拥抱数字
  • Hyperledger fabric2.4 搭建自己的网络

    1 使用cryptogen工具生成证书 1 1 将fabric samples bin目录下的二进制文件复制到 usr local bin目录 以便全局使用这些命令 cd fabric samples bin cp usr local bi
  • 那些你可能遇到的 Linux 命令?什么,你还不知道?赶紧收藏?完善中!

    文章目录 一 Linux 进程 1 通过进程名查找进程号 1 1 ps aux ps ef diff 1 2 ps aux ps aux 什么 它们不一样 1 3 grep awk 取出进程号 取出进程号并 Kill 2 通过进程号查看进程
  • LINUX应用和驱动交互的四种方式

    Linux开发中 应用读取数据时往往会遇到驱动尚未获得有效数据的情况 所以需要采用适合的同步方式 1 非阻塞方式 非阻塞方式 顾名思义就是不管数据是否准备好 驱动都会返回结果 采用这种方式就需要应用不停地重复查询 查询硬件的线程就会一直都占
  • Centos7 升级openssl-1.1.1s及openssh-9.1p1(附脚本)

    主要是上个月openssl出现了漏洞 因此要对服务器的进行升级 建议如果没问题还是尽量别升级 主要步骤是2 脚本内容也只包含升级 1和3是开启和关闭telnet 不建议使用telnet 1 安装和启动telnet 实际中我没使用telnet
  • 数据结构前言

    一 什么是数据结构 数据结构是计算机存储 组织数据的方式 数据结构是指相互之间存在一种或多种特定关系的数据元素的集合 上面是百度百科的定义 通俗的来讲数据结构就是数据元素集合与数据元素集合或者数据元素与数据元素之间的组成形式 举个简单明了的
  • Web Worker 用法

    一 概述 JavaScript 语言采用的是单线程模型 也就是说 所有任务只能在一个线程上完成 一次只能做一件事 前面的任务没做完 后面的任务只能等着 随着电脑计算能力的增强 尤其是多核 CPU 的出现 单线程带来很大的不便 无法充分发挥计
  • DBaaS体系及特性

    用户对云计算的交付能力已经不再满足于单纯的基础设施 IaaS 交付 他们希望数据中心中的更多传统IT 服务能以云服务模式进行交付 其中最为迫切的就是数据库 将数据库以云服务模式交付给用户 就是数据库即服务 DBaaS 也称云数据库 传统数据
  • VirusTotal——您身边的企业安全专家

    本文由 Cloud Ace 整理发布 Cloud Ace 是谷歌云全球战略合作伙伴 拥有 300 多名工程师 也是谷歌最高级别合作伙伴 多次获得 Google Cloud 合作伙伴奖 作为谷歌托管服务商 我们提供谷歌云 谷歌地图 谷歌办公套
  • 基于linux环境下安装jre + eclipse cdt

    博客的排版真的好糟糕 请看点击打开链接 一 下载所用到的软件安装包 1 java运行环境 jre 8u112 linux x64 tar gz 2 elipse cdt版本 eclipse cpp neon 2 linux gtk x86
  • pyahocorasick和pyltp包安装方法

    1 安装pyahocorasick 包 pip install pyahocorasick i Simple Index 这个需要VS环境 如果命令行安装提示没有VS环境可以进入 用VS命令行执行pip命令 即可安装成功 2 安装pyltp
  • Vue中el-dialog的用法

    写入HTML
  • 57 openEuler搭建Mariadb数据库服务器-管理数据库用户

    文章目录 57 openEuler搭建Mariadb数据库服务器 管理数据库用户 57 1 创建用户 57 2 查看用户 57 3 修改用户 57 3 1 修改用户名 57 3 2 修改用户示例 57 3 3 修改用户密码 57 3 4 修
  • 关于javaSE8之后的默认方法的整理

    网络中的说法 关于java8接口中默认方法的使用 8在接口中引入了默认方法 通过在方法前加上default关键字就可以在接口中写方法的默认实现 有点类似于C 中的多继承 但是当多个接口或父类中有相同签名的方法时 会引发一些问题 经过实验得出
  • 射频电路学习之滤波电路

    文章目录 前言 一 滤波电路的分类 二 滤波电路的主要参数 1 插入损耗 IL 2 波纹系数 3 频带宽度 4 矩形系数 5 阻带抑制 三 滤波电路设计 1 集总参数滤波电路 巴特沃斯滤波电路 切比雪夫滤波电路 归一化滤波电路的变换 电路变
  • Topaz Video AI for mac(视频增强和修复工具)

    Topaz Video AI for Mac是一款视频增强和修复工具 采用了人工智能技术 可以提高视频的清晰度 降噪 去抖动和插帧等 这款软件支持多种视频格式 包括MP4 MOV AVI等 使用Topaz Video AI for Mac
  • Python基础—面向对象(超详版)

    Python基础 面向对象 面向对象简介 什么是面向对象 类与对象 父类与子类 面向对象的特性 单继承与多继承 单继承 多继承 多层继承 封装 多态 重写与调用 python重写 python调用 super函数 前言 个人主页 以山河作礼
  • VS 使用System.Console打印时输出窗口不显示

    在项目属性中勾选 启用visual studio承载进程 可以在输出窗口中的调试打印信息中显示System Console打印信息
  • 安装PYG

    目录 1 通过Anaconda安装 2 通过pip安装 3 尝试历程 参考 1 通过Anaconda安装 conda install pyg c pyg c conda forge 2 通过pip安装 首先通过如下命令获取系统torch和C
  • Python并行处理数据多进程/多线程,榨干你的CPU

    前言 最近在公司实习 给整了个活 像是数学建模一样的数据分析的活 目标是在几个互相有关联的大表中找出满足某条件的那些业务 其中第一步就是把两个表拼起来 就叫它们A和B吧 省略拼表过程中需要的逻辑判断 串行 两个长为M和N的表 在判断中需要一