用Python实现多核心并行计算

平常写的程序,无论是单线程还是多线程,大多只有一个进程,而且只能在一个核心里工作。所以很多应用程序即使正在满载运行,在任务管理器中CPU使用量还是只有50%(双核CPU)或25%(四核CPU)

如果能让一个程序自己建立出多个进程,并且让它们并行运行,那么就可以在不同cpu核心上同时运行,进而实现并行计算啦。

Python的并行计算就是这么做的。

这里来看第一个sample:

 1 #main.py
 2 import multiprocessing
 3 import time
 4 import numpy as np
 5 from func import writeln
 6 from calc import calc
 7 import scipy.io as sio
 8
 9 def func1(x):
10     calc()
11     c1=0
12     d1=np.zeros(233,int)
13     for i in xrange(5):
14         d1[c1]=writeln(1,i)
15         c1+=1
16         #time.sleep(1)
17     sio.savemat(‘11.mat‘,{‘dd‘:d1})
18
19 def func2(x):
20     calc()
21     c2=0
22     d2=np.zeros(233,int)
23     for i in xrange(5):
24         d2[c2]=writeln(2,i)
25         c2+=1
26         #time.sleep(1)
27     sio.savemat(‘22.mat‘,{‘dd‘:d2})
28
29 def func3(x):
30     calc()
31     c3=0
32     d3=np.zeros(233,int)
33     for i in xrange(5):
34         d3[c3]=writeln(3,i)
35         c3+=1
36         #time.sleep(1)
37     sio.savemat(‘33.mat‘,{‘dd‘:d3})
38
39 def func4(x):
40     calc()
41     c4=0
42     d4=np.zeros(233,int)
43     for i in xrange(5):
44         d4[c4]=writeln(4,i)
45         c4+=1
46         #time.sleep(1)
47     sio.savemat(‘44.mat‘,{‘dd‘:d4})
48
49 if __name__ == "__main__":
50     pool = multiprocessing.Pool(processes=4)
51
52     pool.apply_async(func1, (1, ))
53     pool.apply_async(func2, (2, ))
54     pool.apply_async(func3, (3, ))
55     pool.apply_async(func4, (4, ))
56
57     pool.close()
58     pool.join()
59
60
61     print "Sub-process(es) done."
1 #func.py
2 def writeln(x,y):
3     aa=x*10+y
4     print(aa)
5     return(aa)
1 #calc.py
2 def calc():
3     x=233
4     for i in xrange(1000000000):
5         x=x+1
6         x=x-1

main.py

Line 49   新建一个进程池,并指定本机cpu核心数量为4

      这样主程序运行时就会建立出4个额外的进程,每个进程可以运行在不同核心上,从而实现了多核并行

Line 51--54   将func1--func4这四个函数都加到进程池中。

       注意,如果我们加入了超过4个func,那么同时只会有四个在运行。剩下的要排队等待

calc.py

这是一个死循环....是为了演示cpu使用量...

运行效果:

单个calc()运行时,CPU占用量是25%

启用multiprocessor之后,一共开启了5个python.exe进程(一个主+4个子进程),cpu占用100%。同时风扇也开始狂转......

因为并行运行时具有顺序不确定性(参考OS课本上的多线程),用print输出结果可能会乱。这里我们都保存到mat文件里。

有了这种方法我就可以让我的训练数据集的程序也并行跑起来啦~特别爽

Reference:

http://www.coder4.com/archives/3352

http://www.cnblogs.com/kaituorensheng/p/4445418.html

http://rfyiamcool.blog.51cto.com/1030776/1357112

时间: 2024-10-10 02:24:07

用Python实现多核心并行计算的相关文章

《简明Python编程》核心笔记(1~5章)

2014年8月20日 <简明Python编程>核心笔记  (1~5章) 昨天和今天两天时间里,把<简明Python编程>这一本书学完了,包括书上的代码.现把核心笔记记录下来,以便以后复习. 第一章 简介 Python语言是少有的一种可以称得上即简单又功能强大的编程语言.你将惊喜地发现Python语言是多么地简单,它注重的是如何解决问题而不是编程语言的语法和结构. Python的特点: 简单 易懂 免费.开源 高层语言:高级语言 可移植性:可以移植在许多平台上.包括Linux.Win

python &nbsp; 学习笔记 (核心)

python    学习笔记 (核心) Python解释器从头到尾一行接一行执行脚本 # -*- coding: UTF-8 -*-    //字符编码 不区分单引号和双引号,x='hello',x[0],x[-1]指最后一个字符,x[2:4]取子串, '''hello''' #hello三引号会保留文本输入时的换行符制表符等不需要转义,用于多行原样输入保存 'hello'+'world' #字符串拼接,'hello'*2 #字符串重复 help(fun) #帮助,help(module.met

python学习之核心数据类型

python核心数据类型 对象类型 例子 数字 1234,-345 字符串 'spam' 列表 [1,3,'ds'] 元组 (1,'spam',6) 字典 {'name':'lili','age':12} 文件 myfile =open('test.text',''w) 集合 set('abc') 其他类型 None 布尔型 编程单元类型 函数,模块,类 数字 加,减,乘,除,就不用说了,+ - * / ** 表示乘方  2**3  表示  2的三次方 结果是8 >>>2**100 12

python加速包numba并行计算多线程

1.下面直接上代码需要注意的地方numba的官网找到 1)有一些坑自己去numba的官网找找看,下面是我的写的一个加速的程序,希望对你有帮助. #coding:utf-8 import time from numba import jit, prange, vectorize from numba import cuda from numba import njit import numpy as np def adds(x,y,m): return [x*i for i in range(y)

二、python基础之核心风格

目录 一.语句和语法 二.变量定义与赋值 三.内存管理 内存管理: 引用计数: 简单例子 四.python对象 五.标识符 六.专用下划线标识符 七.编写模块基本风格 八.示范 一.语句和语法 #:注释 \:转译回车,继续上一行,在一行语句较长的情况下可以使用其来切分成多行,因其可读性差所以不建议使用 ::将两个语句连接到一行,可读性差,不建议使用 ::将代码的头和体分开 语句(代码块)用缩进方式体现不同的代码级别,建议采用4个空格(不要使用tab) python文件以模块的方式组织,编写一个.

python文件修改 核心5步

文件修改 核心5步1.以读的模式打开原文件,产生句柄f12.以写的模式打开另一个原文件,产生句柄f23.读取原文件的内容并将原文件需要替换的内容修改写入到新文件4.删除原文件5.把新文件重名了成原文件 import os # 1.以读的模式打开原文件,产生句柄f1 # 2.以写的模式打开另一个原文件,产生句柄f2 with open('1.txt', encoding='utf-8', mode='r') as f1, open('2.txt', encoding='utf-8', mode='

Python爬虫最为核心的HTTP协议解析,及自定义协议的分析!

机器之间的协议就是机器通信的语法,只有按照这种语法发来的信息,机器之间才能相互理解内容,也可以理解为信息的一种格式. HTTP/IP协议是互联网最为重要的协议,没有HTTP/IP协议,也就没有互联跟不会有网,对于爬虫而言一切数据.请求都是围绕HTTP协议展开.但是在python实现的网络爬虫中都是使用封装好了的请求库如:requests.scrapy.urllib等,这些是对socket的封装,而socket是除了机器语言外最底层的协议. HTTP是公认的协议,但是并不是所有的终端通信都使用HT

22 扩展Python - 《Python 核心编程》

?? 引言/动机 ?? 扩展 Python ?? 创建应用程序代码 ?? 用样板包装你的代码 ?? 编译 ?? 导入并测试 ?? 引用计数 ?? 线程和 GIL ?? 相关话题 22.1 介绍/动机 什么是扩展 一般来说,所有能被整合或导入到其它python 脚本的代码,都可以被称为扩展.您可以用纯 Python 来写扩展,也可以用C 和C++之类的编译型的语言来写扩展(或者也可以用Java 给Jython 写 扩展,也可以用C#或Visual Basic.NET 给IronPython 写扩展

【汇总】Python 编程核心知识体系

[汇总]Python 编程核心知识体系 大神著作,源自:https://woaielf.github.io/2017/06/13/python3-all/ 本文主要涵盖了 Python 编程的核心知识(暂不包括标准库及第三方库,后续会发布相应专题的文章). 首先,按顺序依次展示了以下内容的一系列思维导图:基础知识,数据类型(数字,字符串,列表,元组,字典,集合),条件&循环,文件对象,错误&异常,函数,模块,面向对象编程: 接着,结合这些思维导图主要参考的资料,分享一下我的学习体验,一方面