Python中的并行for循环2025 年 3 月 5 日 | 阅读 10 分钟 多线程是 Python 中的一个重要概念,它允许不同的任务在并行核心或处理器上运行。通过使用并行 For 循环,Python 可以将工作负载分配到线程之间,这在执行大量操作时非常有帮助。在本例中,我们将花时间探讨 Python 中实现并行化最简单的方法之一,即使用并行 FOR LOOPS。多线程 for 循环是并行计算的许多其他并行计算语言和子程序中使用的概念。与常规 for 循环一样,这些循环的工作方式相同,迭代可以在多个线程上同时运行。这种并发可以提高系统资源的利用率,从而提高速度。 理解并行循环并行循环是一种循环,其中所有迭代都由多个线程或进程并行执行,部分或全部执行。这意味着任务本身不必等待循环中的前一个步骤才能运行,这使其效率更高。 并行化 For 循环的必要性在 Python 中处理 For 循环时,尤其是在处理大数据或耗时的计算时,并行化 For 循环非常重要。通过并行执行循环迭代
使用 multiprocessing.pool().map() 并行化循环但是,如果考虑到要并行化的基本循环在 Python 中,multiprocessing.pool().map() 可以完美胜任。multiprocessing 包提供了一套更复杂的工具,通过使用进程池来控制并行执行,该进程池创建多个工作进程来并行运行任务。 multiprocessing.pool().map() 概述multiprocessing 包中的 Pool 类是使用并行处理的最简单方法,因为它带有一个工作进程池。他们提到,当创建一个 Pool 实例时,它会利用所有可用的 CPU 核心来优化系统计算能力的利用率。 Pool 类另一个重要的特性是 map() 函数,它与 Python 内置函数的 map() 进行了比较,但它并行工作。multiprocessing 中的 map() 函数允许将用户定义的函数或操作按顺序应用于所有项。map 允许您将函数并发地传递给可迭代元素,这将工作分配给核心或处理器的数量。 multiprocessing.pool().map() 如何工作?
代码 输出 ['', 'Namaste ', 'Namaste Namaste ', 'Namaste Namaste Namaste ', 'Namaste Namaste Namaste Namaste '] 说明 下面的代码使用 multiprocessing 模块来并行化一个函数,该函数将字符串“Namaste”打印指定的次数。been repeat_value(times) 函数将返回 "Namaste".times 次。主块首先创建并启动一个工作进程池,然后使用 pool.convert to map 将 repeat_value 应用于一系列数字(0 到 4);这将生成一个列表,其中每个元素都是重复的字符串“Namaste”,重复次数由该数字指定。因此,它在其中关闭了池,以便为特定项目释放一些资源。 使用 Joblib 模块Joblib 是一个易于使用且轻量级的 Python 流水线库,用于在不需要重复计算中间计算时执行高效的计算。它最常用于需要对大量数据重复进行相同计算,或者在进行机器学习或计算研究的情况下。Joblib 旨在缓存昂贵计算的结果,从而避免重复计算,从而大大节省时间。 Joblib 的特别之处在于它支持并行处理,这项功能有助于将工作负载分配给多个 CPU 核心并加快执行特定任务的速度。通常,您可以设置要一次执行的作业数量。此数量通常设置为计算机拥有的核心数,以确保 Joblib 最大限度地利用计算机的处理能力。由于在不同核心上划分工作负载,Joblib 甚至并行执行操作,因此执行时间更短。 Joblib 中有两个对象在工作:delayed() 和 Parallel()。delayed() 用于等待特定的方法或函数,然后再执行。这在您想要创建稍后可能并发运行的任务流水线时特别有用。实际上,delayed 所做的是,如果您用 delayed() 包围一个函数调用,您就告诉 Joblib 现在不要运行该函数,而是在它说“好吧,让我们并行处理这个或那个”时,要运行哪个函数? 然而,delta 通过 Parallel() 函数提供了一个解决方案,因为它有助于创建用于并行处理的实例,该实例用于运行延迟的任务。Parallel() 通过指定核心数量来决定一次可以运行多少任务。此函数控制进程,将任务分配给工作核心,并控制其并行化过程。 代码 输出 [10, 11, 12, 13, 14] 说明 这里值得一提的是,这段代码使用了 Joblib 库的并行处理能力。add_10(i) 是一个函数,旨在将 10 添加到一个名为 i 的整数中。这些数字是 0、1、2、3 和 4,如 input 名称下的列表所示。Parallel 函数在这里用于启用 add_10 函数的并行执行,n_jobs=2,使用系统总核心中的 2 个 CPU 核心,通过 map 方法对 input 列表中的每个项进行操作。delayed() 函数有助于延迟对 add_10 函数的调用,并使它们并发运行。最后,输出列表由计算结果组成:每个输入都加上 10,然后显示出来。 使用 Asyncio 模块Asyncio 是 Python 中主要用于处理并发代码的模块,使用 async/await 语法。虽然它专为单线程系统设计,但它通过使用 await 语句在某些点暂停任务的执行来促进多任务处理。这种暂停使得其他任务得以执行,从而产生并行化的外观。 使用 asyncio 实际上意味着主函数以及任何可能被它调用的其他函数都能够并发执行,换句话说,一个函数可以与另一个函数一起执行,而无需等待并被另一个函数阻塞。这是通过事件循环实现的,事件循环实际上是 asyncio 模块的典范。事件循环本身在后台持续运行,以最有效的方式控制和执行这些任务。因此,循环函数以非阻塞的方式与主函数协同工作,从而组织了应用程序的并发任务。 代码 输出 All tasks initiated Task 0 completed Task 1 completed Task 2 completed Task 3 completed Task 4 completed 说明 下面提供的代码利用 Python 的 asyncio 库在计算机上执行函数。run_async:它配备了一个 run_async 装饰器,可以应用于函数,以便使用 run_in_executor 在新线程或进程中运行该函数。它保留了这种可能性,使得主程序可以运行而无需等待封闭的函数完成。与之前的 execute_task 函数类似,该函数只是简单地打印任务已完成并睡眠两秒钟,该函数也使用 run_async 装饰器异步运行。 为此,运行一个循环,调用 execute_task 五次,每次都用不同的标识符启动。所有这些任务几乎同时启动,因为将这些任务实现的循环无法等到循环中的一个任务完成。循环之后,将显示“所有任务已启动”的输出,这意味着所有任务都已启动,并且主程序的代码执行不会中断。当其中每个任务在睡眠两秒后完成时,它会显示一条消息。任务何时执行的不确定性可能导致这些完成消息按顺序到达,以创建任务。它允许一次实现几件事情,尽管它不能使程序中断整个成功运行过程。 使用 Python 并行 For 循环的优点使用 Python 并行 for 循环最明显的优势是提高了耗时或大规模问题的性能。在常规循环运行一组相互依赖的顺序指令时,循环的每个传递都取决于前一个传递;这非常慢,尤其是在处理非常大的数据集或进行密集计算时。另一方面,并行 for 循环利用 CPU 核心或处理器的多任务处理能力来同时执行迭代。 并行循环提供了同时完成任务的多个部分的可能性,通过将工作负载分配给几个线程或进程。这种并发处理在某种程度上最大限度地减少了程序执行或处理的总时间,因为多个核心或处理器同时承担了负载。这还增加了任务完成的价值,并最大化了系统的计算能力利用率。 此外,并行 for 循环提供了更好的资源利用率。在执行任务时,由于以顺序方式运行,多核系统中的一些核心可能保持不活动状态,导致处理核心利用不足。并发意味着所有核心应均匀参与,这使得系统可用资源得到最佳利用。 总而言之,在使用并行 For 循环的情况下,如果需要处理大量数据、进行繁重计算或计算,则更有益。任务可以被分解成部分,而不会影响数据。它们可以在更短的时间内提高计算速率,改善系统资源管理,并更有效地执行计算算法。 结论Python 并行 for 循环是一种循环结构,其迭代在多线程或多进程环境中同时执行,至少部分如此。这种方法对于将计算负载分布到单个芯片上存在的不同核心或处理器至关重要,从而加快了处理速度。 为了使循环类似于 Python 中的并行化,可以执行一些相对的操作。另一种方法是通过 multiprocessing 模块,通过该模块可以创建多个进程来一次性执行要运行的任务。另一个有用的实用程序集是 joblib 模块,它被设计为 Python 的简单并行计算工具;它是一个非常有用的工具,用于执行大批量数据处理和大型数据分析算法。此外,asyncio 模块用于执行异步操作;换句话说,它允许在单线程框架中使用异步范例进行并发操作。上述每个模块都有助于并行化 for 循环,从而提高代码的性能和资源利用率。 下一主题Python 并行化 |
我们请求您订阅我们的新闻通讯以获取最新更新。