自己python程序的并行修改
遇到运算量大的程序,学习了下python并行运算的方法,在自己的程序上进行了修改,看看是否可以增加效率。原始代码是:
import gt_apps as my_apps
f=file('sample.txt','r') for i in range(1,114):
print i
line=f.readline()
source=line.rstrip()
print source.split(' ')
name = source.split(' ')[0]
ra = source.split(' ')[1]
dec = source.split(' ')[2]
rad = 10
input = name+".fits"
output = name+"_gti.fits"
my_apps.maketime['scfile'] = "spacecraft.fits"
my_apps.maketime['filter'] = "(DATA_QUAL>0)&&(LAT_CONFIG==1)"
my_apps.maketime['roicut'] = "no"
my_apps.maketime['evfile'] = input
my_apps.maketime['outfile'] = output
my_apps.maketime.run()
进行了如下优化:
1)用readlines代替readline一次性读出所有数据。
2)for循环改用for line in lline的形式
3)将for循环里的操作内容包装成一个子函数
4)将for循环用pool.map()代替
import gt_apps as my_apps
import numpy as np
import time
from multiprocessing import Pool def mktime(obj):
source=obj.rstrip()
name = source.split(' ')[0]
ra = source.split(' ')[1]
dec = source.split(' ')[2]
input = name+"_filtered.fits"
output = name+"_gti.fits"
my_apps.maketime['scfile'] = "spacecraft.fits"
my_apps.maketime['filter'] = "(DATA_QUAL>0)&&(LAT_CONFIG==1)"
my_apps.maketime['roicut'] = "no"
my_apps.maketime['evfile'] = input
my_apps.maketime['outfile'] = output
print name,ra,dec
my_apps.maketime.run()
if __name__ == '__main__':
f=file('thread.txt','r')
ll=np.genfromtxt('sample.txt',dtype=None)
lline=f.readlines()
print ll,lline
start_time = time.time()
pool = Pool(5)#number of threads
pool.map(mktime,lline)#fuction and par
pool.close()
pool.join()
print "Done,Time taken: {}".format(time.time()-start_time)
后来经过一夜运行,发现一个问题,maketime.run运行的时候才会调用参数,因此map以后,maketime的各个参数很快被再次赋值,导致可能多个maketime运行的是同一套参数。尚未找到解决办法,临时通过限制进程数量确保开始运行的时候的各个进程间参数不一样,由于各个进程运行速度不一,因此后续进行应该可以顺利完成。或者可以通过一次性输入所有参数并执行的方式确保每次参数都不一样,如os.system('gtmktime par=……')(由于mktime.run就是运行gtmktime)。
(2016-1-5 13:35)最后通过用系统命令单行参数直接赋值运行的方式,成功实现了并行计算。
自己python程序的并行修改的更多相关文章
- python 全栈开发,Day38(在python程序中的进程操作,multiprocess.Process模块)
昨日内容回顾 操作系统纸带打孔计算机批处理 —— 磁带 联机 脱机多道操作系统 —— 极大的提高了CPU的利用率 在计算机中 可以有超过一个进程 进程遇到IO的时候 切换给另外的进程使用CPU 数据隔 ...
- Python程序中的进程操作--—--开启多进程
Python程序中的进程操作-----开启多进程 之前我们已经了解了很多进程相关的理论知识,了解进程是什么应该不再困难了,刚刚我们已经了解了,运行中的程序就是一个进程.所有的进程都是通过它的父进程来创 ...
- 【python之路2】CMD中执行python程序中文显示乱码
在IDLE中执行下面代码,中文显示正常: # -*- coding:utf-8 -*- st=raw_input("请输入内容")print st 但在CMD中执行e:\hello ...
- Python 程序员经常犯的 10 个错误
关于PythonPython是一种解释性.面向对象并具有动态语义的高级程序语言.它内建了高级的数据结构,结合了动态类型和动态绑定的优点,这使得... 关于Python Python是一种解释性.面向对 ...
- Python程序的常见错误(收集篇)
关于Python Python是一门解释性的,面向对象的,并具有动态语义的高级编程语言.它高级的内置数据结构,结合其动态类型和动态绑定的特性,使得它在快速应用程序开发(Rapid Applicatio ...
- 编写高质量代码--改善python程序的建议(六)
原文发表在我的博客主页,转载请注明出处! 建议二十八:区别对待可变对象和不可变对象 python中一切皆对象,每一个对象都有一个唯一的标识符(id()).类型(type())以及值,对象根据其值能否修 ...
- 编写高质量代码--改善python程序的建议(八)
原文发表在我的博客主页,转载请注明出处! 建议四十一:一般情况下使用ElementTree解析XML python中解析XML文件最广为人知的两个模块是xml.dom.minidom和xml.sax, ...
- 3.第一个python程序
学习任何一门语言的第一步,首先要写个'hello world',这算是程序员的一个传统.但在写之前,还有注意几个问题. 首先,python是一门脚本语言,而脚本语言的特点就是:我们写的代码会先由解释器 ...
- Python程序的执行原理(转载)
Python程序的执行原理 2013-09-17 10:35 佚名 tech.uc 1. 过程概述 Python先把代码(.py文件)编译成字节码,交给字节码虚拟机,然后虚拟机一条一条执行字节码指令 ...
随机推荐
- 【SqlServer数据类型、C#数据类型、SqlDbType】对应关系及转换
// sql server数据类型(如:varchar)// 转换为SqlDbType类型public static SqlDbType SqlTypeString2SqlType(string sq ...
- POJ 1458 Common Subsequence(LCS最长公共子序列)
POJ 1458 Common Subsequence(LCS最长公共子序列)解题报告 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?c ...
- mysql存储过程详解[转]
1. 存储过程简介 我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储 ...
- JS拖动DIV布局
方法一: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3 ...
- 报错:loaded the "" nib but didn't get a UITableView
在加载OpenPosition界面的时候报错:loaded the "" nib but didn't get a UITableView 原因: If you have a NI ...
- Code one 码
Code one是一种用成像设备识别的矩阵式二维条码.Code one符号中包含可由快速性线性探测器识别的识别图案.每一模块的宽和高的尺寸为X. Code one符号共有10种版本及时14种尺寸.最 ...
- java学习之生产者和消费者案例
package com.gh.thread; /** * 生产者和消费者案例 * wait和sleep的区别 * wait不让出监视器锁,sleep让出监视器的锁 * @author ganhang ...
- 第一种:NStread
- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typica ...
- Object 保存到文件中
6月4日 Object 保存到文件中 Q. 你添加一个新类到你的项目当中且你希望可以保存这个类的一个实例对象到磁盘文件 并在需要时从磁盘文件读回到内存中 A. 方案 确保你的类遵循 NSCodi ...
- HDU 5091 线段树扫描线
给出N个点.和一个w*h的矩形 给出N个点的坐标,求该矩形最多能够覆盖多少个点 对每一个点point(x.y)右边生成相应的点(x+w,y)值为-1: 纵向建立线段树,从左到右扫描线扫一遍.遇到点则用 ...