Python串行运算、并行运算、多线程、多进程对比实验
转自:http://www.redicecn.com/html/Python/20111223/355.html
Python发挥不了多核处理器的性能(据说是受限于GIL,被锁住只能用一个CPU核心,关于这个,这里有篇文章),但是可以通过Python的multiprocessing(多进程)模块或者并行运算模块(例如,pprocess)来使用到多核。
测试代码如下,程序先后分别测试了串行运算、并行运算以及多线程和多进程执行同一个函数所花费的时间。
- #! /usr/local/bin/python2.7
- # test.py
- import time
- import pprocess # 该模块只能在linux下使用
- import threading
- from multiprocessing import Process
- def takeuptime(n):
- chars = 'abcdefghijklmnopqrstuvwxyz0123456789'
- s = chars * 1000
- for i in range(10*n):
- for c in chars:
- s.count(c)
- if __name__ == '__main__':
- list_of_args = [1000, 1000, 1000, 1000]
- # Serial computation
- start = time.time()
- serial_results = [takeuptime(args) for args in list_of_args]
- print "%f s for traditional, serial computation." % (time.time() - start)
- # Parallel computation
- nproc = 4 # maximum number of simultaneous processes desired
- results = pprocess.Map(limit=nproc, reuse=1)
- parallel_function = results.manage(pprocess.MakeReusable(takeuptime))
- start = time.time()
- # Start computing things
- for args in list_of_args:
- parallel_function(args)
- parallel_results = results[:]
- print "%f s for parallel computation." % (time.time() - start)
- # Multithreading computation
- nthead = 4 # number of threads
- threads = [threading.Thread(target=takeuptime, args=(list_of_args[i],)) for i in range(nthead)]
- start = time.time()
- # Start threads one by one
- for thread in threads:
- thread.start()
- # Wait for all threads to finish
- for thread in threads:
- thread.join()
- print "%f s for multithreading computation." % (time.time() - start)
- # Multiprocessing computation
- process = []
- nprocess = 4 # number of processes
- for i in range(nprocess):
- process.append(Process(target=takeuptime, args=(list_of_args[i],)))
- start = time.time()
- # Start processes one by one
- for p in process:
- p.start()
- # Wait for all processed to finish
- for i in process:
- p.join()
- print "%f s for multiprocessing computation." % (time.time() - start)
运行结果如下:
[root@localhost test]# python test.py
62.452934 s for traditional, serial computation.
20.665276 s for parallel computation.
64.835923 s for multithreading computation.
18.392281 s for multiprocessing computation.
从测试结果可以明显看出并行运算和多进程计算速度明显要快于串行计算和多线程计算。
这里有个问题,为什么多线程的所花的时间不比串行单线程的少呢(64.873760 > 62.452934)?
根据我们的常规经验,多线程肯定要比单线程要快,为什么测试结果却不是这样呢?
前面已经提到了,Python只能用到一个CPU核心,因此即便是多线程,在同一时间CPU也只能处理一个线程运算,多个线程并不能并行的运行,他们是轮流切换执行的。
因此,只有当线程中会出现阻塞时,多线程才有意义,比如线程中有数据下载,在等待数据返回时线程阻塞了,此时CPU就可以来处理其它线程的运算。
上面测试程序中的takeuptime()函数没有阻塞,它不停地在进行着运算,所以多线程和单线程的效果是一样的(线程切换也会花费时间,所以此时多线程花费的时候甚至比单线程多一些)。
并行运算和多进程运算之所以快,就是因为他们能同时利用多个CPU核心,多个数据运算能同时进行。
我们把takeuptime()函数改成有阻塞的,再测试一下:
- def takeuptime(n):
- def download(url):
- # simulate downloading
- time.sleep(2)
- for i in range(5):
- html = download('http://www.redicecn.com/page%d.html' % i)
新的运行结果如下:
[root@localhost test]# python test.py
39.996438 s for traditional, serial computation.
10.003863 s for parallel computation.
10.003480 s for multithreading computation.
10.008936 s for multiprocessing computation.
可以看到在有阻塞的数据处理过程中,多线程的作用还是很明显的。
感谢Richard, 和老吴。
Python串行运算、并行运算、多线程、多进程对比实验的更多相关文章
- python学习之多线程多进程
python基础 进程&线程 进程是一组资源的集合,运行一个系统就是打开了一个进程,如果同时打开了两个记事本就是开启了两个进程,进程是一个笼统的概念,进程中由线程干活工作,由进程统一管理 一个 ...
- 011_Python中单线程、多线程和多进程的效率对比实验
Python是运行在解释器中的语言,查找资料知道,python中有一个全局锁(GIL),在使用多进程(Thread)的情况下,不能发挥多核的优势.而使用多进程(Multiprocess),则可以发挥多 ...
- python之路-----多线程与多进程
一.进程和线程的概念 1.进程(最小的资源单位): 进程:就是一个程序在一个数据集上的一次动态执行过程.进程一般由程序.数据集.进程控制块三部分组成. 程序:我们编写的程序用来描述进程要完成哪些功能以 ...
- Python有了asyncio和aiohttp在爬虫这类型IO任务中多线程/多进程还有存在的必要吗?
最近正在学习Python中的异步编程,看了一些博客后做了一些小测验:对比asyncio+aiohttp的爬虫和asyncio+aiohttp+concurrent.futures(线程池/进程池)在效 ...
- 第十章:Python高级编程-多线程、多进程和线程池编程
第十章:Python高级编程-多线程.多进程和线程池编程 Python3高级核心技术97讲 笔记 目录 第十章:Python高级编程-多线程.多进程和线程池编程 10.1 Python中的GIL 10 ...
- Python系列之多线程、多进程
线程是操作系统直接支持的执行单元,因此,高级语言通常都内置多线程的支持,Python也不例外,并且,Python的线程是真正的Posix Thread,而不是模拟出来的线程. Python的标准库提供 ...
- 为什么在Python里推荐使用多进程而不是多线程
转载 http://bbs.51cto.com/thread-1349105-1.html 最近在看Python的多线程,经常我们会听到老手说:"Python下多线程是鸡肋,推荐使用多进程 ...
- 为什么在Python里推荐使用多进程而不是多线程?
最近在看Python的多线程,经常我们会听到老手说:“Python下多线程是鸡肋,推荐使用多进程!”,但是为什么这么说呢? 要知其然,更要知其所以然.所以有了下面的深入研究: 首先强调背景: 1. ...
- 为什么在Python里推荐使用多进程而不是多线程?(为什么python多线程无法增加CPU使用率?)
最近在看Python的多线程,经常我们会听到老手说:“Python下多线程是鸡肋,推荐使用多进程!”,但是为什么这么说呢? 要知其然,更要知其所以然.所以有了下面的深入研究: 首先强调背景: ...
随机推荐
- qt里标识操作系统的宏
qt文件里的 windows的宏是Q_WS_WIN32/* The window system, must be one of: (Q_WS_x) MACX - Mac OS X ...
- 利用 Composer 一步一步构建自己的 PHP 框架(一)——基础准备
『Composer 一统天下的时代已经到来!』——白岩松 “一个时代结束了,另一个时代开始了.” Framework Interoperability Group(框架可互用性小组),简称 FIG,成 ...
- Linux命令之hwclock
转载:http://codingstandards.iteye.com/blog/804830 用途说明 hwclock命令,与clock命令是同一个命令,主要用来查询和设置硬件时钟(query an ...
- A+B Problem(V)
描述 做了A+B Problem之后,Yougth感觉太简单了,于是他想让你求出两个数反转后相加的值.帮帮他吧 输入 有多组测试数据.每组包括两个数m和n,数据保证int范围,当m和n同时为0是表示输 ...
- struts2.1笔记06:struts2开发环境的搭建实际操作出现的问题
1.我根据新建一个struts工程之后,启动报错,如下: 六月 29, 2015 3:08:18 下午 org.apache.catalina.core.AprLifecycleListener in ...
- 如何在Linux上安装Tomcat
Tomcat需要JDK的支持,所以安装Tomcat前先安装JDK. 一.首先到JDK官网下载与自己机器相应的JDK. 注意机器位数,Linux系统的话可以用uname -a命令查看系统信息,如果是Ub ...
- 获取json对象的id或者根据name获取id
--用json的时候,知道id获取对应的name或者相反根据name获取id --内核代码 <script> var products=[{ID:1,Name:"a", ...
- dede只调用当天发布的文档
dede只调用当天发布的文档 dede文章的调用 我需要织梦的模板分别调用,一天内发布的文章,三天内发布的文章,和七天内发布的文章,请问是代码是怎么写的,如何调用,如图所示. 点一天内,显示最近24的 ...
- oracle 学习笔记 复制表结构
1.复制表结构以及数据 create table d_table_name as select * from s_table_name; ---注意并不会创建索引 2.只复制表结构 create t ...
- poj 2492 并查集
思路:当a,b的根节点find(a)与find(b)不同时,就直接将这两个数连接起来.由于每个树的根节点的kind值一定为0,所以,对于a,b的kind值相同,我们就讲其中一个根的kind值变为1,当 ...