• 自己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)最后通过用系统命令单行参数直接赋值运行的方式,成功实现了并行计算。

  • 相关阅读:
    js练习-两个栈实现队列
    js练习- 给你一个对象,求有几层
    React Context上下文
    react-native StatusBar透明
    react-native-splash-screen 隐藏statusbar
    掘金转载-手写一个Promise
    multipart/form-data
    (转)浅谈测试驱动开发(TDD)
    Objective-C urlEncode urlDecode
    (转)在Xcode 7上直接使用Clang Address Sanitizer
  • 原文地址:https://www.cnblogs.com/heshangaichirou/p/5101778.html
Copyright © 2020-2023  润新知