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

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

1、引言



小屌丝:鱼哥,你给我讲一讲并行处理呗。

小鱼:咋的, 你要进军xxx领域了呗?

小屌丝:我这不得与时俱进,紧跟鱼哥的步伐。

小鱼:别扯犊子。说实话,为啥要了解并行处理?

小屌丝:嘿嘿, 就是我想提速啊。

小鱼:… 什么提速?

小屌丝:额,鱼哥, 我指的是代码, 因为循环嵌套多了, 代码运行速度就慢了。

小鱼:哦哦哦, 我也没说别的 ,看你想的挺多啊。

小屌丝:… 我还不了解你。

小鱼:… 还想知道什么是算力吗?

小屌丝:想,非常想,真的好想。

460c98cfb10b477fad952970adce220e.gif


小鱼:… ,我还是跟你说说并行处理吧。



2、并行处理


2.1 定义

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


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


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


高性能计算

科学计算

机器学习

数据挖掘等

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


2.2 并行处理优缺点

优点包括:

提高计算效率和性能

减少等待时间和计算时间

提高系统的可靠性和可用性

有助于实现更高的资源利用率

缺点包括:

需要更多的处理器或计算机资源

可能会增加系统的复杂性和管理成本

可能会导致更高的错误率和故障率



2.3 并行处理的常用库


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


multiprocessing:这是Python标准库中的一个模块,提供了跨平台的多进程支持。它可以通过创建多个进程来实现并行处理。

threading:也是Python标准库中的一个模块,提供了多线程支持。与多进程不同,多线程是在同一个进程内的多个线程之间进行并行处理。

concurrent.futures:这是Python标准库中的一个模块,提供了高级的并行处理接口。它可以通过线程池或进程池来实现并行处理,简化了并行编程的复杂性。

joblib:这是一个第三方库,提供了简单而高效的并行处理工具。它可以通过多进程或多线程来实现并行处理,适用于科学计算和机器学习等领域。

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

代码示例

# -*- 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

并行处理的库并不止这几个, 我只是列举了几个常用的。

如果你有更好,或者你认为更奈斯的库,也可以在评论区留言, 一起讨论。

目录
相关文章
|
6月前
|
分布式计算 并行计算 算法
探索排序的宇宙奥秘:Python中归并排序的并行处理与分布式应用!
【7月更文挑战第11天】归并排序是一种分治算法,适用于并行和分布式处理。在Python中,利用`concurrent.futures`可实现并行归并排序,但因GIL限制,可能需借助`multiprocessing`或GPU库。分布式归并排序则通过分布式框架如Apache Spark处理大规模数据,每个节点独立排序后进行网络合并。并行与分布式技术提升了处理大数据的速度和效率。**
76 9
|
1月前
|
人工智能 数据可视化 数据挖掘
探索Python编程:从基础到高级
在这篇文章中,我们将一起深入探索Python编程的世界。无论你是初学者还是有经验的程序员,都可以从中获得新的知识和技能。我们将从Python的基础语法开始,然后逐步过渡到更复杂的主题,如面向对象编程、异常处理和模块使用。最后,我们将通过一些实际的代码示例,来展示如何应用这些知识解决实际问题。让我们一起开启Python编程的旅程吧!
|
30天前
|
存储 数据采集 人工智能
Python编程入门:从零基础到实战应用
本文是一篇面向初学者的Python编程教程,旨在帮助读者从零开始学习Python编程语言。文章首先介绍了Python的基本概念和特点,然后通过一个简单的例子展示了如何编写Python代码。接下来,文章详细介绍了Python的数据类型、变量、运算符、控制结构、函数等基本语法知识。最后,文章通过一个实战项目——制作一个简单的计算器程序,帮助读者巩固所学知识并提高编程技能。
|
18天前
|
Unix Linux 程序员
[oeasy]python053_学编程为什么从hello_world_开始
视频介绍了“Hello World”程序的由来及其在编程中的重要性。从贝尔实验室诞生的Unix系统和C语言说起,讲述了“Hello World”作为经典示例的起源和流传过程。文章还探讨了C语言对其他编程语言的影响,以及它在系统编程中的地位。最后总结了“Hello World”、print、小括号和双引号等编程概念的来源。
102 80
|
2月前
|
存储 索引 Python
Python编程数据结构的深入理解
深入理解 Python 中的数据结构是提高编程能力的重要途径。通过合理选择和使用数据结构,可以提高程序的效率和质量
152 59
|
7天前
|
Python
[oeasy]python055_python编程_容易出现的问题_函数名的重新赋值_print_int
本文介绍了Python编程中容易出现的问题,特别是函数名、类名和模块名的重新赋值。通过具体示例展示了将内建函数(如`print`、`int`、`max`)或模块名(如`os`)重新赋值为其他类型后,会导致原有功能失效。例如,将`print`赋值为整数后,无法再用其输出内容;将`int`赋值为整数后,无法再进行类型转换。重新赋值后,这些名称失去了原有的功能,可能导致程序错误。总结指出,已有的函数名、类名和模块名不适合覆盖赋新值,否则会失去原有功能。如果需要使用类似的变量名,建议采用其他命名方式以避免冲突。
29 14
|
17天前
|
分布式计算 大数据 数据处理
技术评测:MaxCompute MaxFrame——阿里云自研分布式计算框架的Python编程接口
随着大数据和人工智能技术的发展,数据处理的需求日益增长。阿里云推出的MaxCompute MaxFrame(简称“MaxFrame”)是一个专为Python开发者设计的分布式计算框架,它不仅支持Python编程接口,还能直接利用MaxCompute的云原生大数据计算资源和服务。本文将通过一系列最佳实践测评,探讨MaxFrame在分布式Pandas处理以及大语言模型数据处理场景中的表现,并分析其在实际工作中的应用潜力。
53 2
|
30天前
|
小程序 开发者 Python
探索Python编程:从基础到实战
本文将引导你走进Python编程的世界,从基础语法开始,逐步深入到实战项目。我们将一起探讨如何在编程中发挥创意,解决问题,并分享一些实用的技巧和心得。无论你是编程新手还是有一定经验的开发者,这篇文章都将为你提供有价值的参考。让我们一起开启Python编程的探索之旅吧!
48 10
|
1月前
|
机器学习/深度学习 人工智能 Java
Python 语言:强大、灵活与高效的编程之选
本文全面介绍了 Python 编程语言,涵盖其历史、特点、应用领域及核心概念。从 1989 年由 Guido van Rossum 创立至今,Python 凭借简洁的语法和强大的功能,成为数据科学、AI、Web 开发等领域的首选语言。文章还详细探讨了 Python 的语法基础、数据结构、面向对象编程等内容,旨在帮助读者深入了解并有效利用 Python 进行编程。