楼主: 不二不幸福
1238 2

[问答] 脚本运行效率太低,该怎么优化 [推广有奖]

  • 0关注
  • 1粉丝

硕士生

32%

还不是VIP/贵宾

-

威望
0
论坛币
181 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
1591 点
帖子
76
精华
0
在线时间
159 小时
注册时间
2017-9-26
最后登录
2022-3-30

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
代码如下:
  1. #!~/miniconda2/envs/py3/bin/python
  2. import pysam
  3. import re
  4. import sys
  5. import os
  6. def divide_UMI(s):
  7.     name = s.query_name.split('|')[1]
  8.     UMI1 = re.findall(r'.{12}', name)[0]
  9.     UMI2 = re.findall(r'.{12}', name)[1]
  10.     return(UMI1,UMI2)
  11.    
  12. r1 = pysam.AlignmentFile(sys.argv[1], 'rb')
  13. outfile = pysam.AlignmentFile("raw_duplex.bam","wb",template=r1)
  14. for s1 in r1:
  15.     r2 = pysam.AlignmentFile(sys.argv[2], 'rb')
  16.     for s2 in r2:
  17.         R1_UMI1,R1_UMI2 = divide_UMI(s1)
  18.         R2_UMI1,R2_UMI2 = divide_UMI(s2)
  19.         if(R1_UMI1==R2_UMI2 and R1_UMI2==R2_UMI1 and s1.pos==s2.pos and s1.pnext==s2.pnext):
  20.             outfile.write(s1)
  21.             outfile.write(s2)
  22.         else:
  23.             continue
  24. r2.close()
  25. outfile.close()
  26. r1.close()
复制代码
这个代码的目的是要找到在这两个文件中存在的满足条件的行,比如下面两行:
E00548:177:HKH53CCXY:4:1204:1783:5563|TACAGACTGTGGCAAGCAACCGAT  163     chr22   24930312        54      71M67S  =       24930312        71      GAGAATTGCTTGGGCAGAGGTTGCAGTGAACTGAGATCATGCCACTGCACTCCAGCCTGGCGACAGAGCGAACCACAGTCTGTAAGATCGGAAGAGCGTCGTGTAGGGAAAGAGTGTAGATCTCGGTGGTCGCCGTAT   JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJAJJJJFJJJJAAJJFJFJJJJJAFJJJJJJJJJJFAJAAF   NM:i:0  MD:Z:71 AS:i:71 XS:i:54 RG:Z:L004

E00548:177:HKH53CCXY:4:2210:30573:69678|CAAGCAACCGATTACAGACTGTGG        99      chr22   24930312        54      71M67S  =       24930312        71      GAGAATTGCTTGGGCAGAGGTTGCAGTGAACTGAGATCATGCCACTGCACTCCAGCCTGGCGACAGAGCGAACCACAGTCTGTAAGATCGGAAGAGCACACGTCTGAACTCCAGTCACATCTCGTATGCCGTCTTCTG   JJJJJJJFJJJJJJJJJJFJJJJJJJJJJJJFJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJFJJJJJJJJJJJJAJJJJJJFJJJFFJJJ7   NM:i:0  MD:Z:71 AS:i:71 XS:i:54 RG:Z:L004


这是两行,分别来自打开的两个文件,格式都是相同的,筛选出这两行的条件就是:
1、这两行的第一列中的TACAGACTGTGGCAAGCAACCGAT 与 CAAGCAACCGATTACAGACTGTGG
     第一个的前12个字符等于第二个中的后12个字符,第一个的后12个字符等于第二个中的前12个字符,直观一点就是:
     TACAGACTGTGG   CAAGCAACCGAT
     CAAGCAACCGAT   TACAGACTGTGG
2、第四列值相同
3、这两行的第8列值也相同

如上代码所示,我是对这两个文件用了两个for循环,满足条件的就写入文件,但是这个代码运行得十分缓慢,请问一下怎么修改可以提高运行速度啊?
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝


沙发
杨Yuer参上 发表于 2018-6-28 10:00:07 |只看作者 |坛友微信交流群
可以考虑用高级的数据结构,pandas的DataFrame之类的.
或者用map reduce等高级函数操作.

使用道具

杨Yuer参上 发表于 2018-6-28 10:00
可以考虑用高级的数据结构,pandas的DataFrame之类的.
或者用map reduce等高级函数操作.
不知道该怎么用,所能想到的就是循环。。。。。。。。

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-26 12:27