`

最简单的 python 并行实现方式

阅读更多

简介

在介绍如何最简单地利用 python 实现并行前,我们先来看一个简单的代码。

1
2
3
words = ['apple', 'bananan', 'cake', 'dumpling']
for word in words:
print word

上面的例子中,我们用一个 for 循环打印出 words 列表中的每个单词。问题来了,这里我们打印完一个单词才能接着打印另一个单词,能不能同时打印呢?好比如在银行的营业厅排队,如果只开一个窗口办理业务,你需要等前面一个人办完,才轮到你,如果能开多个窗口,显然会快很多。

我们将上面的代码抽象成下面的模式:

1
2
3
items = list()
for item in items:
process(item)

其中,items 是一个列表,process(arg) 是一个函数,可以有返回值也可以没有。我们希望可以将这种模式改成并行处理的方式,比如可以引入多线程等处理方式,但是这些处理方式往往会让代码变得更加复杂。那么有什么简单的处理方式吗?

并行化

我们将上面的串行模式进行简单地改造,使之可以并行处理:

1
2
3
4
5
6
7
8
from multiprocessing.dummy import Pool as ThreadPool
 
items = list()
 
pool = ThreadPool()
pool.map(process, items)
pool.close()
pool.join()

下面我们进行测试:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# -*- coding: utf-8 -*-
 
import time
from multiprocessing.dummy import Pool as ThreadPool
 
def get_logger(name):
logger = logging.getLogger(name)
logger.setLevel(logging.DEBUG)
 
stream_handler = logging.StreamHandler()
stream_handler.setLevel(logging.DEBUG)
 
formatter = logging.Formatter(
'%(asctime)s - %(name)s [%(levelname)s] %(message)s')
 
stream_handler.setFormatter(formatter)
logger.addHandler(stream_handler)
 
return logger
 
def process(item):
log = _get_logger(item)
log.info("item: %s" % item)
time.sleep(5)
 
 
items = ['apple', 'bananan', 'cake', 'dumpling']
 
pool = ThreadPool()
pool.map(process, items)
pool.close()
pool.join()

输出结果:

1
2
3
4
2016-06-07 11:23:57,530 - apple [INFO] word: apple
2016-06-07 11:23:57,530 - bananan [INFO] word: bananan
2016-06-07 11:23:57,530 - cake [INFO] word: cake
2016-06-07 11:23:57,531 - dumpling [INFO] word: dumpling

从上面显示的时间可以看到,我们已经由原来的串行打印变成并行打印了。

另外,上面的处理函数 process 是没有返回值的。假设 process 函数的返回值是 result,那么 results = pool.map(process, items) 的返回值是一个列表,每个元素对应着处理每个 item 的结果。

因此,

1
2
3
4
5
6
7
results = list()
 
for item in item_list:
result = process(item)
results.append(result)
 
return results

上面的串行处理可以改成下面的并行处理:

1
2
3
4
5
6
7
8
from multiprocessing.dummy import Pool as ThreadPool
 
pool = ThreadPool()
results = pool.map(process, item_list)
pool.close()
pool.join()
 
return results

参考资料

分享到:
评论

相关推荐

    python并行编程 中文版

    本章最后简单介绍了Python编程语言。Pyhton的 易用和易学、可扩展性和丰富的库以及应用,让它成为了一个全能性的工具,当然,在并行计算方面也得 心应手。最后结合在Python中的应用讲了线程和进程。解决一个大问题...

    Python-一个进程级别的python并行框架

    `Python-一个进程级别的python并行框架`,即MultiRunner,为Python开发者提供了一种简单且强大的工具,用于并行处理任务,特别是在深度学习调参等场景下。通过理解和掌握MultiRunner,你可以在实际工作中更有效地...

    python实现并行爬虫

    Python 实现并行爬虫是网络数据采集领域中提高效率的一种常见方法。在这个过程中,我们通常会使用Python的多线程或多进程技术,结合网络请求库如urllib或更强大的requests,以及网页解析库如BeautifulSoup或lxml,来...

    使用python实现ANN

    神经网络的最基本的成分是神经元模型,也就是最简单的神经元模型。 “M-P模型” 如上图所示,神经元接收到来自n个其他神经元传递过来的输入信号,这些信号通过带权重的链接进行传递。神经元接收到的总输入值将与...

    Python语言实现http服务器

    但需要注意,Python的全局解释器锁(GIL)可能会限制多线程在CPU密集型任务中的并行性。 3. **HTTP协议**: HTTP(超文本传输协议)是互联网上应用最广泛的一种网络协议。它定义了客户端(浏览器)与服务器之间的...

    Python-CharmPy是一个通用的并行和分布式编程框架

    这个框架的核心优势在于其简单易用的API,它允许用户通过可迁移的Python对象和远程方法调用来实现复杂的并行计算任务。CharmPy构建在C++编写的Charm++运行时系统之上,这为程序的性能、可伸缩性和动态负载平衡提供了...

    FP-growth算法python实现

    在这个Python实现中,我们将会深入探讨FP-growth的基本原理、Python代码实现以及它如何与FP树数据结构结合来提高效率。 **FP-growth算法概述** FP-growth算法由Hui Han和 Jiawei Han在2000年提出,它的主要优点在于...

    Python 多核并行计算的示例代码

    其中,`Pool`类是最常用的一种方式,它可以轻松实现多进程并行计算。 #### 三、`multiprocessing.Pool`简介 `multiprocessing.Pool`是一种简单且高效的方式来实现多核并行计算。它允许用户将任务分发到多个进程中...

    网格搜索算法(基于Python编程语言实现)

    在Python编程语言中,我们可以利用Scikit-Learn库轻松地实现网格搜索。 一、网格搜索算法基础 1. 超参数与参数:超参数是在开始学习过程之前设置的值,它们控制学习算法的行为。例如,学习率、批次大小、隐藏层节点...

    Python基于pyCUDA实现GPU加速并行计算功能入门教程

    在CUDA的生态中,原本的实现方式依赖于C语言,这虽然功能强大,但对开发者的门槛相对较高,且开发周期较长。而Python作为一种易学易用的语言,因其语法简洁、开发快速等优点,逐渐成为了实现GPU加速计算的另一种选择...

    邮局最佳选址问题分治算法python实现

    总的来说,这个项目提供了一个实践分治算法的机会,并且通过Python实现,可以帮助学习者加深对这两种概念的理解。通过分析和优化邮局的选址,不仅可以提升问题解决能力,还可以锻炼编程技巧,尤其是在处理地理空间...

    用map函数来完成Python并行任务的简单示例

    总的来说,Python的`multiprocessing`模块提供了一套强大的工具来处理并行任务,而`map()`函数结合`Pool`类则为我们提供了一个快速实现并行计算的便捷方式。理解何时使用哪种并行处理策略是提高Python程序性能的关键...

    Python中使用多进程来实现并行处理的方法小结

    总的来说,Python的`multiprocessing`模块为开发者提供了一种跨平台的方式来实现多进程并行处理,它可以帮助我们设计高性能的并发程序,尤其是在需要大量计算的场景下。然而,是否选择多进程还是多线程,应根据具体...

    Parallel Programming with Python

    3. **Python并行编程库**:详细介绍几个常用的Python并行编程库,如`multiprocessing`、`threading`、`concurrent.futures`等。 4. **并发与并行的区别**:明确区分并发与并行的概念,并讨论它们在实际应用中的联系...

    基于python的粒子群算法PSO优化支持向量机SVM设计与实现

    PSO算法以其简单、高效和易于并行化的特点,常被用于优化SVM的参数,如惩罚因子C和核函数的gamma值。 在Python中,我们可以利用Scikit-Learn库来实现SVM,并结合自定义的PSO优化器来寻找最优参数。首先,需要理解...

    Python-Parsl高性能并行Python脚本库

    Parsl的出现,使得并行编程变得更加简单,无需深入理解底层并发机制,即可实现高效执行。 **并行编程模型** Parsl采用函数式编程风格,将任务定义为独立的Python函数,这些函数可以在多个执行环境中并行运行。用户...

    基于python的蚁群算法设计与实现

    Python的灵活性和丰富的库支持使得实现蚁群算法变得相对简单。例如,可以使用NumPy库进行数值计算,Pandas库处理数据,matplotlib库进行可视化,帮助我们更好地理解和优化算法过程。此外,Python的面向对象编程特性...

    使用python实现的以图找图类库

    总的来说,Python实现的以图找图类库利用了计算机视觉和机器学习技术,结合高效的编程工具,为用户提供了便捷、高效的方式来处理图像相似性问题。掌握这些核心概念和工具,开发者可以构建出自己的图像检索系统,满足...

    K-NN.rar python实现版

    总结,K-NN算法在Python中实现简单且高效,尤其适用于小规模数据集和低维数据。在手写数字识别这样的分类任务中,通过适当调整和优化,K-NN算法能够取得不错的效果。了解并掌握K-NN的基本原理和Python实现,对机器...

Global site tag (gtag.js) - Google Analytics