百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

Python中的并行处理:实例编程指南

off999 2024-09-29 16:17 23 浏览 0 评论

并行处理是一种在同一台计算机的多个处理器中同时运行任务的工作模式。 这种工作模式的目的就是减少总的任务处理时间。 在本教程中,您将了解使用python多进程模块对任何类型的逻辑过程进行并行处理的流程。

内容:

1. 简介

2. 最多可以进行多少个并行处理?

3. 什么是同步和异步执行?

4. 问题讨论:计算每行中给定数值范围内的元素个数

不使用并行处理的解答

5. 如何进行函数并行化?

6. 异步并行处理

7. 如何对Pandas DataFrame进行并行处理?

8. 练习

9. 总结

1. 简介

并行处理是一种在同一台计算机的多个处理器中同时运行任务的工作模式。 这种工作模式的目的就是减少总的任务处理时间。但是进程之间的通信会有额外的开销,因此对小的任务而言,总的任务时间会有所增加而不是减少。

在Python语言中,multiprocessing模块通过使用子进程(而不是线程)来运行独立的并行进程。 它可以让您利用机器上的多个处理器(Windows和Unix),也就是说,多个进程可以完全独立的在内存中运行。

学习了本教程的内容之后,您将了解:

  • 在使用multiprocessing进行并行处理时,如何理解语法并组织代码?

  • 如何实现同步和异步并行处理?

  • 使用multiprocessing.Pool接口完成3个不同的用例。

2. 最多可以进行多少个并行处理?

您一次可以运行的最大进程数受计算机中处理器数量的限制。 如果您不知道机器中有多少处理器,可以使用multiprocessing模块中的cpu_count函数进行显示。

Python代码:

3. 同步执行和异步执行?

在并行处理中,有两种执行类型:同步和异步。

同步执行就是各个进程按照启动的先后,顺序完成。 这是通过锁定主程序直到相应的进程运行完毕来实现的。

而异步执行,换句话说,进程的执行不涉及锁定。这样做的结果就是,进程结果返回的顺序可能会混淆,但通常情况下,异步执行会更快完成。

multiprocessing 模块中有两个对象是用来实现函数并行执行的:Pool 类和Process 类。

接下来,我们讨论一个典型的问题,并使用上述技术实现并行处理。在本教程中,我们将重点使用Pool类,因为它使用起来很方便,并可以满足几乎所有的并行处理需求。

4. 问题讨论:计算每行中给定数值范围内的元素个数

第一个问题:给定一个二维矩阵(或者列表和多维列表),计算每行中给定数值范围内的元素个数。我们可以在下面的列表基础上开始工作。

不使用并行处理的参考代码:

我们先看看不用并行计算它需要多长时间。为此,我们对函数howmany_within_range(如下)进行重复以检查在范围内的数有多少个并返回计数。

5. 如何对函数进行并行化处理?

对代码进行并行处理通常的做法是取出其中可以多次运行的特定函数,将其放在不同的处理器上并行运行。

要做到这一点,就需要使用 Pool类对数目为n的处理器进行初始化,之后将想要并行运行的函数传递给Pool类中的并行方法。

multiprocessing.Pool 中提供了 apply, map 和 starmap 等方法对传入的函数并行运行。

这简直太完美了!那么apply和 map之间又有什么区别呢?

apply和 map都是把要进行并行化的函数作为主要参数。但是不同的是, apply接受args参数, 通过args将各个参数传送给被并行化处理的函数,而map 仅将一个迭代器作为参数。

因此,对于简单的可迭代的操作,使用map进行并行处理更适合,而且能更快完成工作。

当我们看到如何使用apply和map对函数howmany_within_range进行并行化处理之后,我们还会介绍starmap。

5.1. Pool.apply 进行并行化处理

我们来使用multiprocessing.Pool,对howmany_within_range 函数进行并行化处理。

5.2. Parallelizing using Pool.map

Pool.map仅接受一个迭代器参数。 为了变通起见,我把howmany_within_range函数做了修改,为 minimum 和 maximum参数设定了缺省值,并另存为新的函数 howmany_within_range_rowonly,这个函数可以只接受行数据列表迭代器作为输入。我知道这种做法不是map的一个最好的用法,但它已经清楚地显示出它与apply的不同之处。

5.3. 使用Pool.starmap 进行并行化

在前面的例子中,我们必须重新定义howmany_within_range函数,让其中的一对参数使用默认值。 而使用starmap,您就能避免这样做。 你怎么问?

与Pool.map一样,Pool.starmap也只仅接受一个迭代器参数,但在starmap中,迭代器种的每一个元件也是一个迭代器。你可以通过这个内部迭代器向被并行化处理的函数传递参数,在执行时再顺序解开,只要传递和解开的顺序一致就可以。

实际上,Pool.starmap就像是一个接受参数的Pool.map版本。

6. 异步并行处理

和同步并行处理对等的异步并行处理函数 apply_async,map_async和starmap_async允许您以异步方式并行执行进程,即下一个进程可以在前一个进程完成时立即启动,而不考虑启动顺序。 因此,无法保证结果与输入的顺序相同。

6.1 使用Pool.apply_async进行并行化

apply_async的使用与apply非常相似,只是你需要提供一个回调函数来告诉如何存储计算结果。

但是,使用apply_async时需要注意的是,结果中的数字顺序会混乱,表明进程没有按照启动的顺序完成。

变通的办法就是,我们重新定义一个新的howmany_within_range2,接受并返回迭代序号(i),然后对最终结果进行排序。

使用apply_async时,不提供回调函数也是可以的。只是这时候,如果您不提供回调函数,那么您将获得pool.ApplyResult对象的列表,其中包含来自每个进程的计算输出值。 从这里,您需要使用pool.ApplyResult.get方法来得到所需的最终结果。

6.2 使用Pool.starmap_async进行并行化

你已经见识了apply_async的使用。你是否可以想象一下或者写一个 starmap_async and map_async的对应版本呢? 实现代码如下:

7. 如何对Pandas DataFrame进行并行处理?

到目前为止,您已经了解了如何通过使函数在列表上工作来进行函数并行化。

但是,在处理数据分析或机器学习项目时,您可能希望对Pandas Dataframe 进行并行化,Pandas Dataframe是除了numpy数组之外,最常用的存储表格数据对象。

在对DataFrame进行并行化时,您可以把要被并行化的函数作为输入参数:

  1. DataFrame的一行

  2. DataFrame的一列

  3. 整个DataFrame

前两个可以使用multiprocessing本身就可以完成。 但是对于最后一个,即对整个dataframe进行并行化,我们将使用pathos包,pathos包内部使用了dill进行序列化。

首先,让我们创建一个简单的dataframe,看看如何进行逐行和逐列进行并行化。 在用户定义的函数种使用了类似pd.apply的写法,但这是并行处理。

现在已经有了dataframe。之后使用hypotenuse对每一行进行处理,每次同时运行4个进程。

为了做到这一点,在下面的代码中,可以看到我们使用了df.itertuples(name=False)。设定name=False, 就可以把dataframe中的每一行作为一个简单的元组送入hypotenuse函数

上面就是对dataframe每一行进行并行化的例子。我们来试试对每一列进行并行化。这里,我使用了 df.iteritems将一列数据作为一个系列传递给sum_of_squares 函数。

接下来是第三部分——完成一个能接收Pandas Dataframe、NumPy数组的并行化函数。Pathos遵循multiprocessing的风格:Pool > Map > Close > Join > Clear。请查看pathos docs文档以获取更多信息。

8. 练习

问题1: 使用 Pool.apply 获取list_a和list_b每一行相同的元素

参考答案:

问题2: 使用 Pool.map 并行运行下面的 python代码

Python代码名称: ‘script1.py’, ‘script2.py’, ‘script3.py’

参考答案:

问题3: 将一个二维列表中的每一行归一化到0到1之间

参考答案:

9. 总结

希望你能完成上面的练习,恭喜你们!

在这篇文章中,我们看到了使用multiprocessing模块实现并行处理的整个过程和各种方法。 哪怕是在具有更多处理器数量的大型计算机上工作,上述过程也几乎相同,您可以通过并行处理获得真正的速度优势。

祝各位编码快乐,下次再见!

英文原文:https://www.machinelearningplus.com/python/parallel-processing-python/ 译者:Xindong

相关推荐

Python钩子函数实现事件驱动系统(created钩子函数)

钩子函数(HookFunction)是现代软件开发中一个重要的设计模式,它允许开发者在特定事件发生时自动执行预定义的代码。在Python生态系统中,钩子函数广泛应用于框架开发、插件系统、事件处理和中...

Python函数(python函数题库及答案)

定义和基本内容def函数名(传入参数):函数体return返回值注意:参数、返回值如果不需要,可以省略。函数必须先定义后使用。参数之间使用逗号进行分割,传入的时候,按照顺序传入...

Python技能:Pathlib面向对象操作路径,比os.path更现代!

在Python编程中,文件和目录的操作是日常中不可或缺的一部分。虽然,这么久以来,钢铁老豆也还是习惯性地使用os、shutil模块的函数式API,这两个模块虽然功能强大,但在某些情况下还是显得笨重,不...

使用Python实现智能物流系统优化与路径规划

阅读文章前辛苦您点下“关注”,方便讨论和分享,为了回馈您的支持,我将每日更新优质内容。在现代物流系统中,优化运输路径和提高配送效率是至关重要的。本文将介绍如何使用Python实现智能物流系统的优化与路...

Python if 语句的系统化学习路径(python里的if语句案例)

以下是针对Pythonif语句的系统化学习路径,从零基础到灵活应用分为4个阶段,包含具体练习项目和避坑指南:一、基础认知阶段(1-2天)目标:理解条件判断的逻辑本质核心语法结构if条件:...

[Python] FastAPI基础:Path路径参数用法解析与实例

查询query参数(上一篇)路径path参数(本篇)请求体body参数(下一篇)请求头header参数本篇项目目录结构:1.路径参数路径参数是URL地址的一部分,是必填的。路径参...

Python小案例55- os模块执行文件路径

在Python中,我们可以使用os模块来执行文件路径操作。os模块提供了许多函数,用于处理文件和目录路径。获取当前工作目录(CurrentWorkingDirectory,CWD):使用os....

python:os.path - 常用路径操作模块

应该是所有程序都需要用到的路径操作,不废话,直接开始以下是常用总结,当你想做路径相关时,首先应该想到的是这个模块,并知道这个模块有哪些主要功能,获取、分割、拼接、判断、获取文件属性。1、路径获取2、路...

原来如此:Python居然有6种模块路径搜索方式

点赞、收藏、加关注,下次找我不迷路当我们使用import语句导入模块时,Python是怎么找到这些模块的呢?今天我就带大家深入了解Python的6种模块路径搜索方式。一、Python模块...

每天10分钟,python进阶(25)(python进阶视频)

首先明确学习目标,今天的目标是继续python中实例开发项目--飞机大战今天任务进行面向对象版的飞机大战开发--游戏代码整编目标:完善整串代码,提供完整游戏代码历时25天,首先要看成品,坚持才有收获i...

python 打地鼠小游戏(打地鼠python程序设计说明)

给大家分享一段AI自动生成的代码(在这个游戏中,玩家需要在有限时间内打中尽可能多的出现在地图上的地鼠),由于我现在用的这个电脑没有安装sublime或pycharm等工具,所以还没有测试,有兴趣的朋友...

python线程之十:线程 threading 最终总结

小伙伴们,到今天threading模块彻底讲完。现在全面总结threading模块1、threading模块有自己的方法详细点击【threading模块的方法】threading模块:较低级...

Python信号处理实战:使用signal模块响应系统事件

信号是操作系统用来通知进程发生了某个事件的一种异步通信方式。在Python中,标准库的signal模块提供了处理这些系统信号的机制。信号通常由外部事件触发,例如用户按下Ctrl+C、子进程终止或系统资...

Python多线程:让程序 “多线作战” 的秘密武器

一、什么是多线程?在日常生活中,我们可以一边听音乐一边浏览新闻,这就是“多任务处理”。在Python编程里,多线程同样允许程序同时执行多个任务,从而提升程序的执行效率和响应速度。不过,Python...

用python写游戏之200行代码写个数字华容道

今天来分析一个益智游戏,数字华容道。当初对这个游戏颇有印象还是在最强大脑节目上面,何猷君以几十秒就完成了这个游戏。前几天写2048的时候,又想起了这个游戏,想着来研究一下。游戏玩法用尽量少的步数,尽量...

取消回复欢迎 发表评论: