遇到运算量大的程序,学习了下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)最后通过用系统命令单行参数直接赋值运行的方式,成功实现了并行计算。