Python3,掌握这几种并行处理,轻轻松松提升for循环速度。

news2024/11/25 2:55:10

并行处理几种方法

  • 1、引言
  • 2、并行处理
    • 2.1 定义
    • 2.2 并行处理优缺点
    • 2.3 并行处理的常用库
    • 2.4 代码示例
      • 2.4.1 multiprocessing
      • 2.4.2 concurrent.futures
      • 2.4.3 joblib
      • 2.4.4 threading
  • 3、总结

1、引言

小屌丝:鱼哥,你给我讲一讲并行处理呗。
小鱼:咋的, 你要进军xxx领域了呗?
小屌丝:我这不得与时俱进,紧跟鱼哥的步伐。
小鱼:别扯犊子。说实话,为啥要了解并行处理?
小屌丝:嘿嘿, 就是我想提速啊。
小鱼:… 什么提速?
小屌丝:额,鱼哥, 我指的是代码, 因为循环嵌套多了, 代码运行速度就慢了。
小鱼:哦哦哦, 我也没说别的 ,看你想的挺多啊。
小屌丝:… 我还不了解你。
小鱼:… 还想知道什么是算力吗?
小屌丝:想,非常想,真的好想。
在这里插入图片描述
小鱼:… ,我还是跟你说说并行处理吧。

2、并行处理

2.1 定义

并行处理是指同时使用多个处理器或计算机来执行一个任务或程序。

在并行处理中,任务被分解成多个子任务,这些子任务被同时处理,然后将结果合并以得出最终结果。

并行处理在许多领域都得到了广泛应用,如:

  • 高性能计算
  • 科学计算
  • 机器学习
  • 数据挖掘等

在这些领域中,处理大量数据或进行复杂的计算任务需要并行处理来提高效率和性能。

2.2 并行处理优缺点

  • 优点包括:

    • 提高计算效率和性能
    • 减少等待时间和计算时间
    • 提高系统的可靠性和可用性
    • 有助于实现更高的资源利用率
  • 缺点包括:

    • 需要更多的处理器或计算机资源
    • 可能会增加系统的复杂性和管理成本
    • 可能会导致更高的错误率和故障率

2.3 并行处理的常用库

在Python中,常用的并行处理库有以下几个:

    1. multiprocessing:这是Python标准库中的一个模块,提供了跨平台的多进程支持。它可以通过创建多个进程来实现并行处理。
    1. threading:也是Python标准库中的一个模块,提供了多线程支持。与多进程不同,多线程是在同一个进程内的多个线程之间进行并行处理。
    1. concurrent.futures:这是Python标准库中的一个模块,提供了高级的并行处理接口。它可以通过线程池或进程池来实现并行处理,简化了并行编程的复杂性。
    1. joblib:这是一个第三方库,提供了简单而高效的并行处理工具。它可以通过多进程或多线程来实现并行处理,适用于科学计算和机器学习等领域。
    1. dask:这是一个用于并行计算的第三方库,可以处理大规模数据集。它提供了类似于NumPy和Pandas的接口,可以在分布式集群上进行并行计算。

2.4 代码示例

这里,我们使用并行处理技术可以加速for循环的计算过程。

2.4.1 multiprocessing

代码示例

# -*- coding:utf-8 -*-
# @Time   : 2023-06-30
# @Author : Carl_DJ

'''
实现功能:
    使用multiprocessing ,进行并行计算。
'''

import multiprocessing

#定义了一个square函数,用于计算一个数的平方值
def square(num):
    return num ** 2

if __name__ == '__main__':
    # 原始列表
    numbers = [1, 2, 3, 4, 5]
    
    # 使用for循环计算平方值
    result_serial = []
    for num in numbers:
        result_serial.append(square(num))
    print("Serial result:", result_serial)
    
    # 使用并行处理计算平方值
    pool = multiprocessing.Pool()
    result_parallel = pool.map(square, numbers)
    pool.close()
    pool.join()
    print("Parallel result:", result_parallel)

解析

  • for循环
    • 是逐个计算每个元素的平方值,并将结果存储在result_serial列表中,也就是串行处理;
  • multiprocessing.Pool()
    • 创建了一个进程池,该进程池可以并行处理任务;
    • 通过调用pool.map()方法,我们将square函数应用于numbers列表中的每个元素,并将结果存储在result_parallel列表中;
    • 这是并行计算的方式。

2.4.2 concurrent.futures

同样, 我们使用并行处理技术可以加速for循环的计算过程。

代码示例

# -*- coding:utf-8 -*-
# @Time   : 2023-06-30
# @Author : Carl_DJ

'''
实现功能:
    使用concurrent.futures ,进行并行计算。
'''


import concurrent.futures

def square(n):
    return n * n

# 串行处理
def serial_processing(numbers):
    results = []
    for num in numbers:
        results.append(square(num))
    return results

# 并行处理
def parallel_processing(numbers):
    results = []
    with concurrent.futures.ThreadPoolExecutor() as executor:
        # 提交任务给线程池
        futures = [executor.submit(square, num) for num in numbers]
        # 获取结果
        for future in concurrent.futures.as_completed(futures):
            results.append(future.result())
    return results

if __name__ == '__main__':
    numbers = [1, 2, 3, 4, 5]
    
    # 串行处理
    serial_results = serial_processing(numbers)
    print("Serial results:", serial_results)
    
    # 并行处理
    parallel_results = parallel_processing(numbers)
    print("Parallel results:", parallel_results)

解析

  • for循环

    • 串行处理函数serial_processing使用for循环逐个计算每个元素的平方值,
    • 并将结果存储在结果列表中;
  • 并行处理

    • 并行处理函数parallel_processing使用concurrent.futures.ThreadPoolExecutor创建一个线程池,
    • 并使用executor.submit方法将任务提交给线程池进行并行处理,
    • 最后,使用concurrent.futures.as_completed方法获取每个任务的结果,并将结果存储在结果列表中。

2.4.3 joblib

同样, 我们使用并行处理技术可以加速for循环的计算过程。

代码示例

# -*- coding:utf-8 -*-
# @Time   : 2023-06-30
# @Author : Carl_DJ

'''
实现功能:
    使用joblib ,进行并行计算。
'''

from joblib import Parallel, delayed

def square(x):
    return x**2

# 使用for循环串行处理
def serial_processing(input_list):
    result = []
    for num in input_list:
        result.append(square(num))
    return result

# 使用joblib并行处理
def parallel_processing(input_list):
    num_cores = 4  # 设置并行处理的核心数
    result = Parallel(n_jobs=num_cores)(delayed(square)(num) for num in input_list)
    return result

# 测试代码
input_list = [1, 2, 3, 4, 5]
print("Serial processing:", serial_processing(input_list))
print("Parallel processing:", parallel_processing(input_list))

2.4.4 threading

关于threading , 我们再熟悉不过了 。
这里,小鱼直接上代码。

代码示例

# -*- coding:utf-8 -*-
# @Time   : 2023-06-30
# @Author : Carl_DJ

'''
实现功能:
    使用threading,进行并行计算。
'''
import threading

#square_list_serial函数,使用for循环串行处理
def square_list_serial(input_list):
    result = []
    for num in input_list:
        result.append(num ** 2)
    return result

input_list = [1, 2, 3, 4, 5]
result_serial = square_list_serial(input_list)
print(result_serial)

#并行处理
def square_list_parallel(input_list, result, index):
    for i, num in enumerate(input_list):
        result[index + i] = num ** 2

def square_list_parallel_threads(input_list):
    result = [0] * len(input_list)
    num_threads = 4  # 设置线程数量
    threads = []
    chunk_size = len(input_list) // num_threads

    for i in range(num_threads):
        start = i * chunk_size
        end = start + chunk_size if i < num_threads - 1 else len(input_list)
        thread = threading.Thread(target=square_list_parallel, args=(input_list[start:end], result, start))
        threads.append(thread)
        thread.start()

    for thread in threads:
        thread.join()

    return result

input_list = [1, 2, 3, 4, 5]
result_parallel = square_list_parallel_threads(input_list)
print(result_parallel)

当然,关于threading的并行处理,小鱼也写过一些博文,如:

  • 接口测试开发之:Python3,订单并发性能实战
  • Python3,我用这种方式讲解python模块,80岁的奶奶都说能理解。建议收藏 ~ ~

3、总结

看到这里,今天的分享差不多就结束了。
今天主要介绍了Python常用的并行处理的 库:

  • multiprocessing
  • threading
  • concurrent.futures
  • joblib
  • dask

并行处理的库并不止这几个, 我只是列举了几个常用的。
如果你有更好,或者你认为更奈斯的库,也可以在评论区留言, 一起讨论。

我是小鱼

  • CSDN 博客专家
  • 阿里云 专家博主
  • 51CTO博客专家
  • 51认证讲师等
  • 认证金牌面试官
  • 职场面试及培训规划师
  • 多个国内主流技术社区的认证专家博主
  • 多款主流产品(阿里云等)测评一、二等奖获得者

关注我,带你学习更多更专业更前言的测试开发技术。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/702873.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android:datePicker对话框的使用

一、前言&#xff1a;这篇文章是关于DatePickerDialog&#xff0c;点击按钮出现一个日期选择器对话框&#xff0c;通过点击确认把选则的日期显示到文本控件上。 二、上代码 页面布局xml <?xml version"1.0" encoding"utf-8"?> <LinearLayout…

正则表达式回溯引发的生产惨案

文章目录 背景问题原因分析如何解决&#xff1f;chatgpt 3.5GP4的表现未完待续 背景 业务上的一个字段在解析时为了避免脏数据导致后续ETL的异常&#xff0c;决定从源头将该字段严格按照设计的规则去匹配。该字段的上传是设备端传上来的文件中的一个字段。 正向&#xff1f;反…

「C/C++」C++类与类的关系(UML类图+代码说明)

✨博客主页&#xff1a;何曾参静谧的博客 &#x1f4cc;文章专栏&#xff1a;「C/C」C/C学习 相关术语 &#x1f3af;依赖关系&#xff08;Dependency&#xff09;&#xff1a;表示一个类的实现需要另一个类的协助&#xff0c;虚线箭头&#xff0c;箭头指向被依赖的类。 &#…

基于当量因子法、InVEST、SolVES模型等多技术融合在生态系统服务功能社会价值评估中的应用及论文写作、拓展分析

生态系统服务是人类从自然界中获得的直接或间接惠益&#xff0c;可分为供给服务、文化服务、调节服务和支持服务4类&#xff0c;对提升人类福祉具有重大意义&#xff0c;且被视为连接社会与生态系统的桥梁。自从启动千年生态系统评估项目&#xff08;Millennium Ecosystem Asse…

2023软科中国大学智能建造专业排名结果出炉(共54所高校)

智能建造专业&#xff08;Intelligent Construction&#xff09;是一个新兴的跨学科领域&#xff0c;它涉及到建筑、土木工程、计算机科学、数据科学等多个学科的知识。智能建造专业专注于研究如何利用先进的计算机技术、人工智能&#xff08;AI&#xff09;、物联网&#xff0…

进销存软件市场成熟,为什么还要用低代码构建?

关键词&#xff1a;进销存软件、群晖NAS、低代码平台 编者按&#xff1a; 进销存管理软件产业已经逐步走向成熟&#xff0c;产品种类也越来越丰富&#xff0c;也正因如此&#xff0c;企业在选择购买进销存软件的时候&#xff0c;往往不知该如何选择。不少的企业会直接选择平台型…

[golang 微服务] 8.go-micro的负载均衡操作,go Web框(Gin,Beego)调用go-micro微服务

一.先创建go-micro服务端 启动consul 需要先启动consul, consol相关内容见 [golang 微服务] 5. 微服务服务发现介绍,安装以及consul的使用,Consul集群 [golang 微服务] 6. GRPC微服务集群Consul集群grpc-consul-resolver案例演示 启动consul命令,这里,使用dev模式: consul agen…

手机上怎么压缩视频?教你几招手机压缩视频小技巧

压缩视频是一种有益的技术&#xff0c;可以帮助人们在存储、传输和观看视频时更有效率和便捷。尤其是在现今数字化信息时代&#xff0c;视频已经成为人们日常生活中不可或缺的一部分&#xff0c;因此更需要使用视频压缩技术来更好地管理和使用这些视频文件。下面给大家分享几种…

Yolov8优化: 多分支卷积模块RFB,扩大感受野提升小目标检测精度

1.RFB-Net介绍 论文&#xff1a;https://arxiv.org/pdf/1711.07767.pdf 代码&#xff1a;GitHub - GOATmessi7/RFBNet: Receptive Field Block Net for Accurate and Fast Object Detection, ECCV 2018 受启发于人类视觉的Receptive Fields结构&#xff0c;本文提出RFB&#xf…

3.1 C++纯虚函数

C 纯虚函数 C的纯虚函数是一种特殊的虚函数&#xff0c;没有函数体&#xff0c;只有函数原型。 纯虚函数语法格式为&#xff1a; 等号后面的 0 表示该函数为纯虚函数。 纯虚函数在抽象类中定义&#xff0c;抽象类是指包含至少一个纯虚函数的类&#xff0c;不能被实例化。 …

bim在建筑工程中的应用有哪些?

BIM以其在协同设计、冲突检测、可视化沟通、项目控制和可持续性设计等方面的应用&#xff0c;提高了建筑工程的效率、质量和可持续性&#xff0c;为各利益相关者带来了诸多益处。它已逐渐成为现代建筑工程不可或缺的重要工具和方法。BIM在建筑工程的作用越来越明显。 ​  BIM…

HOT29-删除链表的倒数第 N 个结点

leetcode原题链接&#xff1a;删除链表的倒数第 N 个结点 题目描述 删除链表的倒数第 N 个结点。 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,…

伦敦金k线图基础知识有多重要?

正所谓万丈高楼平地起&#xff0c;不积跬步无以至千里&#xff0c;在投资市场上也才如此&#xff0c;从来没有投资者能够在伦敦金市场上一蹴而就地取得成功&#xff0c;很多成功的交易者都是一步一个脚印&#xff0c;从最基础知识开始学起&#xff0c;逐渐成为专业的投资者。 看…

新星计划2023【Java基础及数据库Mysql】学习方向报名入口!

新星计划2023【Java基础及数据库Mysql】学习方向报名入口&#xff01; 一、关于本学习方向导师二、关于本学习方向官方微信群三、关于活动时间&奖品&要求四、学习计划五、TOP5评选规则六、活动要求七、注意事项 本赛道是针对那些希望从事Java开发并且想要学习如何与数据…

NVIDIA-Linux-x86_64-535.54.03.run cuda_12.2.0_535.54.03_linux.run下载地址

Official Drivers | NVIDIA Linux x64 (AMD64/EM64T) Display Driver | 535.54.03 | Linux 64-bit | NVIDIA 下载连接 Download NVIDIA, GeForce, Quadro, and Tesla DriversDownload drivers for NVIDIA graphics cards, video cards, GPU accelerators, and for other GeFor…

CAD转换PDF怎么转换?教你几种简单转换方法

CAD&#xff08;计算机辅助设计&#xff09;是一种广泛应用于工程设计和制造领域的软件。虽然CAD可以生成高质量的设计图纸&#xff0c;但是在与其他人共享这些图纸时可能会出现问题。因此&#xff0c;将CAD文件转换成PDF可以在各种设备上打开和查看。此外PDF还可以在不改变文件…

Postman设置断言

目录 前言&#xff1a; 一、断言的定义 二、Postman断言的语法 三、Postman中chai.js断言常用语法 前言&#xff1a; 在进行API测试时&#xff0c;断言是一项重要的功能。它能帮助我们验证接口的响应是否符合预期结果&#xff0c;从而确保API的正确性和可靠性。在Postman中…

Hudi 文件布局(File Layouts)

文章目录 Hudi File Layouts1 核心概念1.1 Base File1.2 Base File1.3 File Slice1.4 File Group 2. File Layouts写过程2.1 COW表2.2 MOR表 Hudi File Layouts 1 核心概念 File Layouts&#xff08;文件布局&#xff09;是指Hudi的数据文件在存储介质上的分布&#xff0c;Hu…

剑指 Offer ! ! 36. 二叉搜索树与双向链表

剑指 Offer 36. 二叉搜索树与双向链表 输入一棵二叉搜索树&#xff0c;将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点&#xff0c;只能调整树中节点指针的指向。 为了让您更好地理解问题&#xff0c;以下面的二叉搜索树为例&#xff1a; 思路&…

Spring Boot 中的 @MessageMapping 注解:原理、用法与示例

Spring Boot 中的 MessageMapping 注解&#xff1a;原理、用法与示例 前言 随着 Web 技术的发展&#xff0c;越来越多的应用程序开始使用 WebSocket 协议来实现实时通信。Spring Boot 提供了对 WebSocket 的支持&#xff0c;其中 MessageMapping 注解是一个常用的注解&#x…