免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3809 | 回复: 4
打印 上一主题 下一主题

一个python程序优化问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-07-08 20:34 |只看该作者 |倒序浏览
现有一个文件,test.txt,部分内容如下:
  1. rs376643643     chr1    10020   A       deletion        
  2. rs373328635     chr1    10055   A       insertion      
  3. rs144773400     chr1    10145   A       deletion        
  4. rs375931351     chr1    10147   C       deletion        
  5. rs367896724     chr1    10177   C       insertion       0.4253
  6. rs143255646     chr1    10229   A       deletion        
  7. rs200462216     chr1    10229   AACCCCTAACCCTAACCCTAAACCCTA     deletion        
  8. rs376846324     chr1    10231   C       deletion        
  9. rs540431307     chr1    10235   A       insertion       0.001198
  10. rs375044980     chr1    10250   AC      deletion        
  11. rs140194106     chr1    10255   A       deletion        
  12. rs201106462     chr1    10329   ACCCCTAACCCTAACCCTAACCCT        deletion        
  13. rs150969722     chr1    10330   C       deletion        
  14. rs145072688     chr1    10352   A       insertion       0.4375
  15. rs555500075     chr1    10352   A       insertion       0.4375
  16. rs147093981     chr1    10383   C       insertion      
  17. rs373144384     chr1    10390   C       deletion        
  18. rs56289060      chr1    10433   C       insertion      
  19. rs112766696     chr1    10440   C       deletion        
  20. rs376342519     chr1    10617   CGCCGTTGCAAAGGCGCGCCG   deletion        0.993
  21. rs538791886     chr1    13290   CT      deletion        0.003994
  22. rs201747181     chr1    13958   C       deletion        
  23. rs370886505     chr1    14398   TGT     deletion        
  24. rs372598081     chr1    14512   AG      deletion        
  25. rs368127301     chr1    15903   C       insertion       0.4411
  26. rs557514207     chr1    15903   C       insertion       0.4411
  27. rs533210981     chr1    16912   A       deletion        0.000599
  28. rs376400995     chr1    28327   T       deletion        
  29. rs373063181     chr1    28590   TTGG    insertion      
  30. rs369270395     chr1    30868   CTCT    deletion        
  31. rs370806791     chr1    40894   A       insertion      
  32. rs545414834     chr1    46286   TAT     deletion        0.004992
  33. rs199681827     chr1    46402   TGT     insertion      
  34. rs200430748     chr1    47190   A       insertion      
  35. rs564373876     chr1    48174   T       insertion       0.001198
  36. rs200846102     chr1    49515   G       deletion        
  37. rs374041055     chr1    50300   A       deletion        
  38. rs528351826     chr1    51715   AGTT    deletion        0.0009984
  39. rs546829777     chr1    51973   GAC     deletion        0.000599
  40. rs568235219     chr1    52153   TAAT    deletion        0.000599
复制代码
要进行如下处理:
  1. #!usr/bin/env python
  2. rs={}
  3. for i in range(1,23):
  4.     rs_key='chr'+str(i)
  5.     rs[rs_key]=''
  6. rs['chrX']='';rs['chrY']='';rs['chrM']=''
  7. dbINDE_file=open('/ifs4/B2C_NIFTY/USER/quning/data/dbINDEL_142','r')
  8. for line in dbINDE_file:
  9.     bo=line[0:-1].split('\t')
  10.     len_str=str(len(bo[3]))
  11.     if len(bo)>5:
  12.         bo[0]=bo[0]+':'+bo[5]
  13.     if bo[4]=='insertion':
  14.         bo[2]=float(bo[2])+1
  15.         rs[bo[1]] += (str(bo[2])+'ins'+bo[3]+' '+bo[0]+' ')
  16.     elif bo[4]=='deletion':
  17.        rs[bo[1]] += (str(bo[2])+'del'+len_str+' '+bo[0]+' ')
  18.     else:
  19.        rs[bo[1]] += (str(bo[2])+'del'+len_str+' '+bo[0]+' ')
  20.        bo[2]=float(bo[2])+1
  21.        rs[bo[1]] += (str(bo[2])+'ins'+bo[3]+' '+bo[0]+' ')
  22. dbINDE_file.close()
  23. for key in rs:
  24.     print key  
  25.     print rs[key]
复制代码
由于test.txt包括chr1到chr23,和chrX,chrY,chrM的所有内容,数据很多,运行很慢,哪位大神可以帮忙优化一下,提高运行速度?先谢谢啦!

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
2 [报告]
发表于 2016-07-09 11:46 |只看该作者
回复 1# anna_bi


    你应该在处理数据的时候只处理数据,没必要在中间的处理过程中不断的构造输出结果,只需要把必要的数据记录下即可,在输出的时候再构造必要的字符串。这样会少消耗不少的内存和处理时间。

论坛徽章:
4
白羊座
日期:2013-11-05 10:26:09冥斗士
日期:2015-11-17 14:19:55白银圣斗士
日期:2015-11-17 15:13:0815-16赛季CBA联赛之新疆
日期:2016-04-01 09:10:58
3 [报告]
发表于 2016-07-11 11:49 |只看该作者
回复 1# anna_bi

  • 如果文件不是非常大,同时内存足够的情况下,把文件内容的读取和数据处理分开,可以把读取集中处理,减少每次读一小部分带来的效率损耗;同时,由于是读取之后处理,所有数据是在内存中,效率会有一定提升。
  • 因为你的数据处理是针对每条记录进行的,处理过程相对独立,可以通过引入multiprocessing.Pool,使用map来使用多个进程来处理数据,去提高处理速度,但是如果数据量不大的情况下,或者CPU core只有一个,速度不会有明显提升,甚至会有下降可能出现。

论坛徽章:
0
4 [报告]
发表于 2016-07-11 13:08 |只看该作者
本帖最后由 yyl910606 于 2016-07-11 13:29 编辑

代码瓶颈在于 字符拼接
测试机器  amd 4核 6G内存
不拼接字符串  24M 的数据 14秒处理完成
拼接字符串 24M数据  1个小时
  1. #coding:utf8       
  2. from time import sleep
  3. import multiprocessing
  4. from multiprocessing.process import Process
  5. import threading
  6. import os


  7. def process_func(line):
  8.         result = {}
  9.         bo = line[:-1].split()
  10.         len_str = str(len(bo[3]))
  11.         if len(bo) > 5:
  12.                 bo[0] = bo[0] + ":" + bo[5]
  13.         if bo[4] == 'insertion':
  14.                 bo[2] = float(bo[2])+ 1
  15.                 if bo[1] in result:
  16.                         result[bo[1]] += str(bo[2]) + 'ins' + bo[3] + ' ' + bo[0] + ' '
  17.                 else:
  18.                         result[bo[1]] = str(bo[2]) + 'ins' + bo[3] + ' ' + bo[0] + ' '

  19.         elif bo[4] == 'deletion':
  20.                 if bo[1] in result.keys():
  21.                         result[bo[1]] += str(bo[2]) + 'del' + len_str + ' ' + bo[0] + ' '
  22.                 else:
  23.                         result[bo[1]] = str(bo[2]) + 'del' + len_str + ' ' + bo[0] + ' '
  24.         else:
  25.                 if bo[1] in result.keys():
  26.                         result[bo[1]] += str(bo[2])+'del'+len_str+' '+ bo[0]+' '
  27.                         b[2] = float(bo[2]) + 1
  28.                         result[bo[1]] += str(bo[2])+'ins'+bo[3]+' '+ bo[0]+' '
  29.                 else:
  30.                         result[bo[1]] = str(bo[2]) + 'del'+len_str+' '+ bo[0]+' '
  31.                         b[2] = float(bo[2]) + 1
  32.                         result[bo[1]] += str(bo[2]) + 'ins' + bo[3] + ' '+ bo[0]+' '

  33.         return result

  34. def worker(rqueue, wqueue):
  35.         while True:
  36.                 if not rqueue.empty():
  37.                         line = rqueue.get()
  38.                         rs = process_func(line)
  39.                         wqueue.put(rs)
  40.                 else:
  41.                         sleep(0.1)

  42. def dict_process(wqueue):
  43.         while True:
  44.                 if not wqueue.empty():
  45.                         d = wqueue.get()
  46.                         for i in d.keys():
  47.                                 global result
  48.                                 result[i] += d[i]
  49.                 else:
  50.                         sleep(0.1)


  51. def main():
  52.         global result
  53.         result = {'chr' + str(i): '' for i in xrange(1,23)}
  54.         for item in ['chrY', 'chrX', 'chrM']:
  55.                 result[item] = ''
  56.         rqueue = multiprocessing.Queue()
  57.         wqueue = multiprocessing.Queue()
  58.         prs_num = multiprocessing.cpu_count()
  59.         prs  = []
  60.         for i in xrange(prs_num):
  61.                 prs.append(Process(target=worker, args=(rqueue, wqueue,)))
  62.         map(lambda x: x.start(), prs)
  63.         dict_process_thread = threading.Thread(target=dict_process, args=(wqueue,))
  64.         # 字符瓶颈
  65.         # dict_process_thread.start() 关闭后速度明显快很多
  66.         dbINDE = open('data.txt')
  67.         while True:
  68.                 line = dbINDE.readline()
  69.                 if not line:
  70.                         break
  71.                 rqueue.put(line)
  72.                 #print wqueue.get()
  73.         while True:
  74.                 #if wqueue.qsize() == 0:  # 开启字符拼接
  75.                 if wqueue.qsize() != 0:  #关闭字符拼接
  76.                         # kill child process
  77.                         #print result
  78.                         for p in prs:
  79.                                 pid = p.pid
  80.                                 if pid:
  81.                                         os.kill(pid, 9)

  82.                         # kill self
  83.                         sleep(1)
  84.                         os.kill(os.getpid(), 9)


  85.        

  86. if __name__ == '__main__':
  87.         main()
复制代码

论坛徽章:
0
5 [报告]
发表于 2016-07-14 11:30 |只看该作者
可以考虑以下的优化步骤:
1. 使用python2.6,安装psyco加速
2. 读文件使用文件快读取,读取速度是逐行的4倍以上
3. 读取一块后使用线程处理,保持读和处理并行处理
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP