一文速通 Python 并行计算:00 并行计算的基本概念

摘要:

该文介绍了 Python 并行计算的核心概念、编程模型及其应用,并介绍了了并行程序的性能分析与优化方法,如并行效率、加速比及 Amdahl 定律。此外,该文介绍了共享内存、消息传递、数据并行和任务并行等并行编程模型,并提供 Python 环境配置指南。

关于我们更多介绍可以查看云文档:Freak 嵌入式工作室云文档,或者访问我们的 wiki:https://github.com/leezisheng/Doc/wik

原文链接:

FreakStudio的博客

往期推荐:

学嵌入式的你,还不会面向对象??!

全网最适合入门的面向对象编程教程:00 面向对象设计方法导论

全网最适合入门的面向对象编程教程:01 面向对象编程的基本概念

全网最适合入门的面向对象编程教程:02 类和对象的 Python 实现-使用 Python 创建类

全网最适合入门的面向对象编程教程:03 类和对象的 Python 实现-为自定义类添加属性

全网最适合入门的面向对象编程教程:04 类和对象的Python实现-为自定义类添加方法

全网最适合入门的面向对象编程教程:05 类和对象的Python实现-PyCharm代码标签

全网最适合入门的面向对象编程教程:06 类和对象的Python实现-自定义类的数据封装

全网最适合入门的面向对象编程教程:07 类和对象的Python实现-类型注解

全网最适合入门的面向对象编程教程:08 类和对象的Python实现-@property装饰器

全网最适合入门的面向对象编程教程:09 类和对象的Python实现-类之间的关系

全网最适合入门的面向对象编程教程:10 类和对象的Python实现-类的继承和里氏替换原则

全网最适合入门的面向对象编程教程:11 类和对象的Python实现-子类调用父类方法

全网最适合入门的面向对象编程教程:12 类和对象的Python实现-Python使用logging模块输出程序运行日志

全网最适合入门的面向对象编程教程:13 类和对象的Python实现-可视化阅读代码神器Sourcetrail的安装使用

全网最适合入门的面向对象编程教程:全网最适合入门的面向对象编程教程:14 类和对象的Python实现-类的静态方法和类方法

全网最适合入门的面向对象编程教程:15 类和对象的 Python 实现-__slots__魔法方法

全网最适合入门的面向对象编程教程:16 类和对象的Python实现-多态、方法重写与开闭原则

全网最适合入门的面向对象编程教程:17 类和对象的Python实现-鸭子类型与“file-like object“

全网最适合入门的面向对象编程教程:18 类和对象的Python实现-多重继承与PyQtGraph串口数据绘制曲线图

全网最适合入门的面向对象编程教程:19 类和对象的 Python 实现-使用 PyCharm 自动生成文件注释和函数注释

全网最适合入门的面向对象编程教程:20 类和对象的Python实现-组合关系的实现与CSV文件保存

全网最适合入门的面向对象编程教程:21 类和对象的Python实现-多文件的组织:模块module和包package

全网最适合入门的面向对象编程教程:22 类和对象的Python实现-异常和语法错误

全网最适合入门的面向对象编程教程:23 类和对象的Python实现-抛出异常

全网最适合入门的面向对象编程教程:24 类和对象的Python实现-异常的捕获与处理

全网最适合入门的面向对象编程教程:25 类和对象的Python实现-Python判断输入数据类型

全网最适合入门的面向对象编程教程:26 类和对象的Python实现-上下文管理器和with语句

全网最适合入门的面向对象编程教程:27 类和对象的Python实现-Python中异常层级与自定义异常类的实现

全网最适合入门的面向对象编程教程:28 类和对象的Python实现-Python编程原则、哲学和规范大汇总

全网最适合入门的面向对象编程教程:29 类和对象的Python实现-断言与防御性编程和help函数的使用

全网最适合入门的面向对象编程教程:30 Python的内置数据类型-object根类

全网最适合入门的面向对象编程教程:31 Python的内置数据类型-对象Object和类型Type

全网最适合入门的面向对象编程教程:32 Python的内置数据类型-类Class和实例Instance

全网最适合入门的面向对象编程教程:33 Python的内置数据类型-对象Object和类型Type的关系

全网最适合入门的面向对象编程教程:34 Python的内置数据类型-Python常用复合数据类型:元组和命名元组

全网最适合入门的面向对象编程教程:35 Python的内置数据类型-文档字符串和__doc__属性

全网最适合入门的面向对象编程教程:36 Python的内置数据类型-字典

全网最适合入门的面向对象编程教程:37 Python常用复合数据类型-列表和列表推导式

全网最适合入门的面向对象编程教程:38 Python常用复合数据类型-使用列表实现堆栈、队列和双端队列

全网最适合入门的面向对象编程教程:39 Python常用复合数据类型-集合

全网最适合入门的面向对象编程教程:40 Python常用复合数据类型-枚举和enum模块的使用

全网最适合入门的面向对象编程教程:41 Python常用复合数据类型-队列(FIFO、LIFO、优先级队列、双端队列和环形队列)

全网最适合入门的面向对象编程教程:42 Python常用复合数据类型-collections容器数据类型

全网最适合入门的面向对象编程教程:43 Python常用复合数据类型-扩展内置数据类型

全网最适合入门的面向对象编程教程:44 Python内置函数与魔法方法-重写内置类型的魔法方法

全网最适合入门的面向对象编程教程:45 Python实现常见数据结构-链表、树、哈希表、图和堆

全网最适合入门的面向对象编程教程:46 Python函数方法与接口-函数与事件驱动框架

全网最适合入门的面向对象编程教程:47 Python函数方法与接口-回调函数Callback

全网最适合入门的面向对象编程教程:48 Python函数方法与接口-位置参数、默认参数、可变参数和关键字参数

全网最适合入门的面向对象编程教程:49 Python函数方法与接口-函数与方法的区别和lamda匿名函数

全网最适合入门的面向对象编程教程:50 Python函数方法与接口-接口和抽象基类

全网最适合入门的面向对象编程教程:51 Python函数方法与接口-使用Zope实现接口

全网最适合入门的面向对象编程教程:52 Python函数方法与接口-Protocol协议与接口

全网最适合入门的面向对象编程教程:53 Python字符串与序列化-字符串与字符编码

全网最适合入门的面向对象编程教程:54 Python字符串与序列化-字符串格式化与format方法

全网最适合入门的面向对象编程教程:55 Python字符串与序列化-字节序列类型和可变字节字符串

全网最适合入门的面向对象编程教程:56 Python字符串与序列化-正则表达式和re模块应用

全网最适合入门的面向对象编程教程:57 Python字符串与序列化-序列化与反序列化

全网最适合入门的面向对象编程教程:58 Python字符串与序列化-序列化Web对象的定义与实现

全网最适合入门的面向对象编程教程:59 Python并行与并发-并行与并发和线程与进程

更多精彩内容可看:

给你的 Python 加加速:一文速通 Python 并行计算

一文搞懂 CM3 单片机调试原理

肝了半个月,嵌入式技术栈大汇总出炉

电子计算机类比赛的“武林秘籍”

一个MicroPython的开源项目集锦:awesome-micropython,包含各个方面的Micropython工具库

Avnet ZUBoard 1CG开发板—深度学习新选择

工程师不要迷信开源代码,还要注重基本功

什么?配色个性化的电机驱动模块?!!

什么?XIAO主控新出三款扩展板!

手把手教你实现Arduino发布第三方库

万字长文手把手教你实现MicroPython/Python发布第三方库

文档获取:

可访问如下链接进行对文档下载:

https://github.com/leezisheng/Doc

该文档是一份关于 并行计算Python 并发编程 的学习指南,内容涵盖了并行计算的基本概念、Python 多线程编程、多进程编程以及协程编程的核心知识点:

正文

在阅读本文档之前,需要注意的是,本文档不涉及对计算机体系结构(SISD\MISD 等)和内存组织、以及 MPP 大规模并行处理、异构计算等知识点讲解,主要侧重于基于 Python 语言的多线程并发、多进程并行、任务同步、消息传输、调试测试等知识点的实现和应用。

1.1 什么是并行计算?并行计算的特点

什么是传统的串行计算?传统的软件是按照串行计算的编程思想来编写的。串行计算程序是运行在具有一个核心(或 CPU)的单机上。一个等待解决的问题被分解为一串独立的命令执行(instructions 命令执行流,也可以是线程)。命令执行流会一个挨一个的,顺序执行。并且在任一时刻都只有一个命令执行流正在执行中。 换句话说,任何时候只有一个线程在执行。

并行计算用最简单的话来解释并行计算就是同时使用 多个计算资源 (就是多个 CPU)去运行程序来解决一个需要大量计算的问题 。并行计算程序运行在一个多核心(或多 CPU)的计算机、或者由多台计算机组成的网络上。需要进行大量计算的问题,需要被分解成多个独立的、能够同时运行的部分。不同部分的命令执行流可以同时在不同的 CPU 上得到执行。 换句话说,在同一时间可以有多个线程在执行。

1.2 并行计算的关键概念

  • 任务并行和数据并行:任务并行是指在多个处理器上同时执行不同的任务;数据并行是指在多个处理器上同时执行相同的操作,但是对不同的数据子集执行
  • 并行度:这是一个度量,表示在给定时间内可以并行执行的任务数量。
  • 并行算法和并行编程:并行算法是设计用于并行计算的算法,而并行编程是实现这些算法的过程。并行编程可能涉及使用特定的并行编程语言或并行处理库。

1.3 并行计算的学习内容

  • 深入理解并行计算的概念:除了理解基本的并行计算概念(如并行与串行的区别,数据并行与任务并行的概念等)外,还应深入研究并行算法和并行编程模型。了解各种并行架构(如共享内存、分布式内存和混合模型)以及并行编程范式(如消息传递、数据并行、任务并行和流并行)。
  • 编写并优化并行程序:使用 Python 的 multiprocessing 等编写更复杂的并行程序,例如实现并行排序或并行搜索算法。此外,学习并实践如何优化并行程序,包括负载平衡、减少通信开销、避免同步延迟等。
  • 并行程序的性能分析:学习使用专门的工具(例如 Python 的 cProfile 模块或其他性能分析工具)来分析并行程序的性能。理解并行效率、加速比、Amdahl 定律等概念,并学习如何使用这些概念来评估并行程序的性能。
  • 理解并行计算的挑战和解决方案:深入理解并行计算的挑战,包括数据依赖性、竞态条件、死锁、并行开销等,并学习如何避免或处理这些问题。理解并行编程中的同步和锁定概念,并学习使用 Python 的 threading 或 multiprocessing 库来处理并发问题。

1.4 并行编程模型

并行编程模型是描述并行程序设计和执行的高级概念。这些模型为程序员提供了一种方式来组织和控制并行程序的计算和通信。有许多不同类型的并行编程模型,包括以下几种:

  • 共享内存模型:在这种模型中,所有处理器都可以访问同一内存空间。处理器通过读写这个共享的内存空间来进行通信。这种模型简单易用,但可能需要处理数据一致性和同步的问题。
  • 消息传递模型:在这种模型中,每个处理器都有自己的内存空间,处理器之间通过发送和接收消息来进行通信。这种模型适合在没有共享内存的分布式系统中使用。
  • 数据并行模型:在这种模型中,数据被划分成多个部分,每个部分在一个处理器上独立处理。这种模型适合处理大量的数据,并且每个数据的处理方式相同。
  • 任务并行模型:在这种模型中,不同的任务被分配给不同的处理器。每个任务可能需要执行不同的操作,且可能相互依赖。

选择使用哪种并行编程模型取决于问题的性质和可用的硬件资源。不同的模型可能需要不同的编程技巧和工具。

1.5 并行程序性能评价

在优化程序性能的过程中,性能分析是一个关键步骤。性能分析可以帮助你了解程序的运行情况,找出瓶颈,从而可以针对这些瓶颈进行优化。

Python 有一个内置的模块叫做 cProfile,它是一个非常强大的性能分析工具。cProfile 模块可以提供关于你的程序哪些部分最消耗时间的详细统计信息。使用 cProfile 模块,你可以看到你的程序中每个函数调用的次数,每次调用的时间,以及每个函数总共运行的时间。这些信息可以帮助你找出程序的瓶颈。

常用性能指标包括:

  • 并行效率:并行效率是一个衡量并行程序性能的指标。它是串行程序运行时间与并行程序运行时间和处理器数量的乘积的比值。并行效率的理想值是 1,这意味着并行程序的性能与处理器数量成正比。然而,由于通信开销和同步延迟等问题,实际的并行效率通常会低于 1。
  • 加速比:加速比是另一个衡量并行程序性能的指标。它是串行程序运行时间与并行程序运行时间的比值。理想情况下,加速比应该等于处理器的数量,但实际上由于通信和同步等开销,加速比通常会低于处理器的数量。
  • Amdahl 定律:Amdahl 定律是一个描述并行程序性能上限的定理。它指出,对于一个给定的问题,即使我们有无限数量的处理器,由于程序中的串行部分,我们的加速比也会有一个上限。

1.6 环境配置

本文档中示例代码需要的依赖库及其版本如下所示,我们使用 miniconda 配置最基本的 Python 环境即可:

这里我们使用 Pycharm IDE 进行编程:

一文速通Python并行计算:00 并行计算的基本概念的更多相关文章

  1. (数据科学学习手札151)速通pandas2.0新版本干货内容

    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 大家好我是费老师,前两天pandas正式发布了其 ...

  2. 一文速览Vue全栈

    一文速览Vue全栈 原创: 新哥Lewis 天道酬勤Lewis 7月7日 Vue 是一套用于构建用户界面的渐进式框架.与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用,专注于声明式渲染视图 ...

  3. 21天学通Python课后实验题4.6

    21天学通Python课后实验题4.6 1. 编程实现用户输入一门课程的两门子课程成绩,第一门子课程60分以上,则显示“通过”,第一门子课程不及格,则显示“未通过”,第一门子课程及格,而第二门子课程不 ...

  4. 【资源分享】半条命2速通AHK脚本

    *----------------------------------------------[下载区]----------------------------------------------* ...

  5. 一文讲通.NET Core部署到Windows IIS最全解决方案

    回顾之前的ASP.NET的经典托管 在经典ASP.NET应用程序中,所有一切都托管在IIS工作进程中(w3wp.exe),这也被称为IIS应用程序池.ASP.NET程序被托管在应用程序池中,并且被按照 ...

  6. Linux速通 随笔整理

    Linux速通 随笔整理 为了方便阅读,特整理了相关的学习笔记 零.大纲 一.系统安装 二.命令格式 三.文件管理 四.用户群组 五.文件处理 六.系统初始化及监控 七.硬盘初始化 八.网络原理

  7. 21天学通Python PDF完整版

    有需要的点击这里自取 内容简介  · · · · · · <21天学通Python>全面.系统.深入地讲解了Python编程基础语法与高级应用.在讲解过程中,通过大量实际操作的实例将Pyt ...

  8. 转---一文读懂 python 的元类

    译注:这是一篇在Stack overflow上很热的帖子.提问者自称已经掌握了有关Python OOP编程中的各种概念,但始终觉得元类(metaclass)难以理解.他知道这肯定和自省有关,但仍然觉得 ...

  9. python中基于descriptor的一些概念(下)

    @python中基于descriptor的一些概念(下) 3. Descriptor介绍 3.1 Descriptor代码示例 3.2 定义 3.3 Descriptor Protocol(协议) 3 ...

  10. python中基于descriptor的一些概念

    python中基于descriptor的一些概念(上) 1. 前言 2. 新式类与经典类 2.1 内置的object对象 2.2 类的方法 2.2.1 静态方法 2.2.2 类方法 2.3 新式类(n ...

随机推荐

  1. SpringBoot整合WebSocket实践

    简介 先来看下维基百科WebSocket的简介: WebSocket是一种与HTTP不同的协议.两者都位于OSI模型的应用层,并且都依赖于传输层的TCP协议. 虽然它们不同,但是RFC 6455中规定 ...

  2. LLM Defenses Are Not Robust😭to Multi-Turn Human Jailbreaks Yet😲

  3. 在用Android StudioBuild项目时,提示:Could not resolve all files for configuration ':classpath'.Could not find com.android.tools.

    在用Android StudioBuild项目时,提示:Could not resolve all files for configuration ':classpath'.Could not fin ...

  4. 记录以下uniapp写小程序然后进行图片上传压缩

    今天记录一下uniapp写小程序上传图片压缩的功能 首先定义上传图片的方法 然后res.tempFilePath[0]就是图片的临时路径 其次定义压缩图片然后获取压缩后图片大小的方法,方法使用canv ...

  5. Golang sync.pool源码解析

    Golang sync.pool源码解析 - sync.pool - 是什么 - 怎么用 - demo - 真实世界的使用 - 源码解读-数据结构 - 源码解读-读写流程 - 写流程 - 读流程 - ...

  6. react事件 报错Cannot read property 'setState' of undefined

    import React, { Component } from "react"; export class TestHanderClick extends Component { ...

  7. 【忍者算法】LeetCode必刷100题:一份来自面试官的算法地图(题解持续更新中)

    (本文字数2900,阅读大约需15分钟) 上一篇文章我们讨论了如何科学地刷题,今天我要带大家深入了解这100道精选题目背后的分类逻辑.作为一名面试官,我希望通过这篇文章,为大家绘制一张完整的算法知识地 ...

  8. Spring AI + DeepSeek:提升业务流程的智能推理利器

    今天,我们将深入探讨如何利用DeepSeek来真正解决我们当前面临的一些问题.具体来说,今天我们仍然会将DeepSeek接入到Spring AI中进行利用.需要注意的是,虽然DeepSeek目前主要作 ...

  9. 鸿蒙页面开发 - 组件复用样式 @Styles

    这篇文章介绍一个装饰器 @Styles 他的主要作用是: 当多个组件都有相同的样式,如果每个组件单独设置,会造成大量重复的代码冗余.这时我们可以使用 @Styles 将这些相同样式封装成一个方法,供这 ...

  10. VMware常用操作

    VMware常用操作 VMware作为一款功能强大的虚拟化软件,为用户提供了一个灵活.高效的虚拟环境.在日常使用中,掌握VMware的常用操作对于提高工作效率.优化资源配置至关重要.以下将详细介绍VM ...