Perl 板


LINE

请问各位,我现在有一笔约10万笔基因序列的资料, 部分内容如下: >Locus_41_Transcript_1/7_Confidence_0.385_Length_892 >Locus_41_Transcript_2/7_Confidence_0.385_Length_920 >Locus_41_Transcript_3/7_Confidence_0.577_Length_1466 >Locus_41_Transcript_4/7_Confidence_0.577_Length_1431 >Locus_41_Transcript_5/7_Confidence_0.538_Length_1359 >Locus_41_Transcript_6/7_Confidence_0.577_Length_1431 >Locus_41_Transcript_7/7_Confidence_0.577_Length_1431 >Locus_42_Transcript_1/1_Confidence_1.000_Length_2058 >Locus_43_Transcript_1/10_Confidence_0.312_Length_1094 >Locus_43_Transcript_2/10_Confidence_0.469_Length_1565 以locus_41为例,它有7笔资料,最後的数字是该序列的长度, 像这样的资料,我只要取长度最大的一笔。 若是locus_42,因为只有一笔,所以不用取舍,直接使用。 我写的程式码如下: #!/usr/bin/env -perl -w use Bio::DB::Fasta; open my $query, "<", $ARGV[0] or die "$!"; my (%query_hash, %whole); while (my $line = <$query>) { chomp ($line); if ($line =~ /^>/) { my @line = split (/_/, $line); my $name = substr($line[0], 1)."_$line[1]"; $whole{substr($line, 1)} = "$name $line[7]"; #把所有内容皆读入hash。 if (! exists $query_hash{$name}) { $query_hash{$name} = $line[7]; } elsif ($query_hash{$name} <= $line[7]) { $query_hash{$name} = $line[7]; #保留数字最大的一笔 } } } close $query; my $db = Bio::DB::Fasta->new($ARGV[1]); my @query_hash_result; foreach my $result (keys %query_hash) { my $query_whole = "$result $query_hash{$result}"; while (my ($key, $value) = each (%whole)) { if ($value eq $query_whole) { #重新取得完整的标题,用以取得DNA序列资料。 my $query_fasta = $db->get_Seq_by_id($key); my $query_seq = $query_fasta->seq; print ">$query_fasta\n"; print "$query_seq\n"; } } } 现在遇到的状况是,如果我只执行上半部的程式码,即把标题资料读入hash, 没什麽问题,不会用很多时间。 在%query_hash里,大约会取得7万笔资料。 而%whole里,大约有14万笔资料。 但,当我把2个hash放在一起比较,要取回完整的标题时, 整个执行的速度慢了相当多! 请问是不是我写的程式码里有问题?应该要怎麽修改会比较好? 谢谢 --



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 140.116.25.64
※ 文章网址: http://webptt.com/cn.aspx?n=bbs/Perl/M.1395997757.A.123.html
1F:推 LiloHuang:由於第二个 while loop 会将整个 %whole 都拜访一次 03/28 17:54
2F:推 LiloHuang:当 %whole 很大时,时间复杂度会大幅度的提高 03/28 17:54
3F:→ LiloHuang:如果只是需要把完整标题拿出来,可以考虑多记忆一些内容 03/28 17:55
4F:→ LiloHuang:例如改成 $query_hash{$name} = [最大数, 完整的一行]; 03/28 17:56
5F:→ LiloHuang:这样在跑第二个回圈时,就不需要对 %whole 从头查到尾 03/28 17:57
6F:推 LiloHuang:或者把每一行的内容放在单独的 array 里面 03/28 18:04
7F:→ LiloHuang:$query_hash{$name} = [最大数, 完整资料的索引]; 03/28 18:05
8F:→ chong:谢谢你的建议,我再尝试看看。 03/28 21:57
9F:推 rkcity:是Lilo大!! (膜拜 03/29 17:13
10F:→ chong:速度差非常多,旧的用了数小时,新的瞬间秒杀! 03/31 11:10
11F:→ hhs66317:Lilo的思路值得学习﹐赞~~ 06/01 10:09







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:Soft_Job站内搜寻

TOP