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

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

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

之前的理解错了......还是要学习一个

1、多线程与多进程

之前OS课学过.....

in general,线程是比进程低一级的调度单位。一个进程可以包含多个进程。

线程之间的切换相对于进程之间更为方便,代价也更低。所以讲道理多线程的效率比多进程是要高的。

Linux自从2.6内核开始,就会把不同的线程交给不同的核心去处理。Windows也从NT.4.0开始支持这一特性。

【ref:http://blog.csdn.net/delacroix_xu/article/details/5928121

2.多线程与Python

好多语言都可以很好的资词多线程。然而Python是个例外......

对于IO密集型的任务,使用多线程还是能提高一下CPU使用率。对于CPU密集型的任务,Python中的多线程其实是个鸡肋......没卵用......

在Python的解释器CPython中存在一个互斥锁。简单来讲就是同一时间只能有一个线程在执行,其它线程都处于block模式。

【ref:https://www.zhihu.com/question/22191088

3.多进程

要想在py中充分利用多核cpu,就只能用多进程了。

虽然代价高了些,但是比起并行计算带来的性能提升这些也微不足道了。最重要的是好!写!啊!

这里来看第一个sample:

 #main.py
import multiprocessing
import time
import numpy as np
from func import writeln
from calc import calc
import scipy.io as sio def func1(x):
calc()
c1=0
d1=np.zeros(233,int)
for i in xrange(5):
d1[c1]=writeln(1,i)
c1+=1
#time.sleep(1)
sio.savemat('11.mat',{'dd':d1}) def func2(x):
calc()
c2=0
d2=np.zeros(233,int)
for i in xrange(5):
d2[c2]=writeln(2,i)
c2+=1
#time.sleep(1)
sio.savemat('22.mat',{'dd':d2}) def func3(x):
calc()
c3=0
d3=np.zeros(233,int)
for i in xrange(5):
d3[c3]=writeln(3,i)
c3+=1
#time.sleep(1)
sio.savemat('33.mat',{'dd':d3}) def func4(x):
calc()
c4=0
d4=np.zeros(233,int)
for i in xrange(5):
d4[c4]=writeln(4,i)
c4+=1
#time.sleep(1)
sio.savemat('44.mat',{'dd':d4}) if __name__ == "__main__":
pool = multiprocessing.Pool(processes=4) pool.apply_async(func1, (1, ))
pool.apply_async(func2, (2, ))
pool.apply_async(func3, (3, ))
pool.apply_async(func4, (4, )) pool.close()
pool.join() print "Sub-process(es) done."
 #func.py
def writeln(x,y):
aa=x*10+y
print(aa)
return(aa)
 #calc.py
def calc():
x=233
for i in xrange(1000000000):
x=x+1
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

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

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

    2014年8月20日 <简明Python编程>核心笔记  (1~5章) 昨天和今天两天时间里.把<简明Python编程>这一本书学完了,包含书上的代码.现把核心笔记记录下来,以 ...

  2. Python 编程语言的核心是什么?

    01 Python 编程语言的核心是什么? ​   为什么要问这个问题? 我想要用Python实现WebAssembly,这并不是什么秘密.这不仅可以让Python进入浏览器,而且由于iOS和Andr ...

  3. python学习之核心数据类型

    python核心数据类型 对象类型 例子 数字 1234,-345 字符串 'spam' 列表 [1,3,'ds'] 元组 (1,'spam',6) 字典 {'name':'lili','age':1 ...

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

    1.下面直接上代码需要注意的地方numba的官网找到 1)有一些坑自己去numba的官网找找看,下面是我的写的一个加速的程序,希望对你有帮助. #coding:utf-8 import time fr ...

  5. python文件修改 核心5步,函数实现修改任意文件内容

    文件修改 核心5步1.以读的模式打开原文件,产生句柄f12.以写的模式打开一个新文件,产生句柄f23.读取原文件的内容并将原文件需要替换的内容修改写入到新文件4.删除原文件5.把新文件重名了成原文件 ...

  6. python学习(二)python中的核心数据类型

    数据类型是编程语言中的很重要的一个组成部分,我所知道的有数据类型的好处有:在内存中存放的格式知道,规定了有哪几种可用的操作. 我的埋点:为什么要有数据类型 那么python中的数据类型有哪几种呢? 对 ...

  7. 第二篇:python基础之核心风格

    阅读目录 一.语句和语法 二.变量定义与赋值 三.内存管理 内存管理: 引用计数: 简单例子 四.python对象 五.标识符 六.专用下划线标识符 七.编写模块基本风格 八.示范 一.语句和语法 # ...

  8. 第一篇.1、python基础之核心风格

    一.语句和语法 #:注释 \:转译回车,继续上一行,在一行语句较长的情况下可以使用其来切分成多行,因其可读性差所以不建议使用 ::将两个语句连接到一行,可读性差,不建议使用 ::将代码的头和体分开 语 ...

  9. Python面向对象编程核心思想

    原文地址https://blog.csdn.net/weixin_42134789/article/details/80194788 https://blog.csdn.net/happyjxt/ar ...

随机推荐

  1. Oracle Sales Cloud:管理沙盒(定制化)小细节2——使用对象触发器更新数字字段

    在上一篇 "管理沙盒(定制化)小细节1" 的随笔中,我们使用公式法在 "业务机会" 对象(单头)上建立了 "利润合计" 字段,并将它等于 & ...

  2. iOS 开发者账号到期续费流程

    1.登录developer.apple.com,查看到期时间 2.到期提醒通知,点击Renew Membership续费(一般提前一个月提醒续费) 3.个人开发者账号续费需要支付 688人民币/年(9 ...

  3. linux jexus 服务 设置开机启动

    linux的服务开机设置一般在 /etc/init.d/里 而jexus的默认安装目录在 /usr/jexus里 启动文件为 jws 参数 有start stop restart 这里贡献一个刚写好的 ...

  4. 【代码笔记】iOS-页面之间的跳转效果

    一,工程图. 二,代码. RootViewController.m -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { ...

  5. Appfuse:添加自定义页面组件

    我之前是做ASP.NET的,碰到被多个页面都使用的类似组件后,就想着采用ascx(用户自定义组件)来解决,那做Java我也想用这种方案. 我要做的效果如下: 实现方案:tag方式(自定义标签) 1. ...

  6. ffmpeg 安装,转视频格式为m3u8,压缩视频

    # ffmpegffmpeg 安装,转视频格式为m3u8,压缩视频 ## ffmpeg 安装直接安装: apt-get install ffmpeg 运行 `ffmpeg` 看是否出现版本号以判断是否 ...

  7. SQL Server 如何通过SQL语句定位SSRS中的具体报表

    在一些IT技术人员的推广.简单培训后,公司很多部门都有一些非IT技术人员参与开发各自需求的Reporting Service报表.原因很简单,罗列出来的原因大概有这样一些: IT部门的考量: 1:IT ...

  8. count(*) 与count (字段名)的区别

    count(*) 查出来的是:结果集的总条数 count(字段名) 查出来的是: 结果集中'字段名'不为空的记录的总条数

  9. Webform(六)——登录状态保持(Cookies内置对象)

    用户用浏览器访问一个网站,由于采用的http的特性,Web服务器并不能知道是哪一个用户正在访问,但一些网站,希望能够知道访问者的一些信息,例如是不是第一次访问,访问者上次访问时是否有未做完的工作,这次 ...

  10. SQL Server 2012 新特性:服务角色管理

    数据库角色管理,已经可以使用alter role,create role和drop role. 2012增加了几个ddl语句,可以操作服务级别的角色管理,   CREATE SERVER ROLE 用 ...