study の効果


制限酵素のサイトを調べる事があったら、`study` はわりと効果あるかも知れない。
ま、塩基配列を相手にごりごり書く事は無くなってるんだけど、、、


```perl:test.pl
my $str = join "", split /\n/, <<'EOF' ;
GCACATAACGGGCAGAACGCACTGCGAAGCGGCTTCTTCAGAGCACGGGCTGGAACTGGCAGGCACCGCG
AGCCCCTAGCACCCGACAAGCTGAGTGTGCAGGACGAGTCCCCACCACACCCACACCACAGCCGCTGAAT
GAGGCTTCCAGGCGTCCGCTCGCGGCCCGCAGAGCCCCGCCGTGGGTCCGCCCGCTGAGGCGCCCCCAGC
CAGTGCGCTCACCTGCCAGACTGCGCGCCATGGGGCAACCCGGGAACGGCAGCGCCTTCTTGCTGGCACC
CAATAGAAGCCATGCGCCGGACCACGACGTCACGCAGCAAAGGGACGAGGTGTGGGTGGTGGGCATGGGC
ATCGTCATGTCTCTCATCGTCCTGGCCATCGTGTTTGGCAATGTGCTGGTCATCACAGCCATTGCCAAGT
TCGAGCGTCTGCAGACGGTCACCAACTACTTCATCACTTCACTGGCCTGTGCTGATCTGGTCATGGGCCT
GGCAGTGGTGCCCTTTGGGGCCGCCCATATTCTTATGAAAATGTGGACTTTTGGCAACTTCTGGTGCGAG
TTTTGGACTTCCATTGATGTGCTGTGCGTCACGGCCAGCATTGAGACCCTGTGCGTGATCGCAGTGGATC
GCTACTTTGCCATTACTTCACCTTTCAAGTACCAGAGCCTGCTGACCAAGAATAAGGCCCGGGTGATCAT
TCTGATGGTGTGGATTGTGTCAGGCCTTACCTCCTTCTTGCCCATTCAGATGCACTGGTACCGGGCCACC
CACCAGGAAGCCATCAACTGCTATGCCAATGAGACCTGCTGTGACTTCTTCACGAACCAAGCCTATGCCA
TTGCCTCTTCCATCGTGTCCTTCTACGTTCCCCTGGTGATCATGGTCTTCGTCTACTCCAGGGTCTTTCA
GGAGGCCAAAAGGCAGCTCCAGAAGATTGACAAATCTGAGGGCCGCTTCCATGTCCAGAACCTTAGCCAG
GTGGAGCAGGATGGGCGGACGGGGCATGGACTCCGCAGATCTTCCAAGTTCTGCTTGAAGGAGCACAAAG
CCCTCAAGACGTTAGGCATCATCATGGGCACTTTCACCCTCTGCTGGCTGCCCTTCTTCATCGTTAACAT
TGTGCATGTGATCCAGGATAACCTCATCCGTAAGGAAGTTTACATCCTCCTAAATTGGATAGGCTATGTC
AATTCTGGTTTCAATCCCCTTATCTACTGCCGGAGCCCAGATTTCAGGATTGCCTTCCAGGAGCTTCTGT
GCCTGCGCAGGTCTTCTTTGAAGGCCTATGGGAATGGCTACTCCAGCAACGGCAACACAGGGGAGCAGAG
TGGATATCACGTGGAACAGGAGAAAGAAAATAAACTGCTGTGTGAAGACCTCCCAGGCACGGAAGACTTT
GTGGGCCATCAAGGTACTGTGCCTAGCGATAACATTGATTCACAAGGGAGGAATTGTAGTACAAATGACT
CACTGCTGTAAAGCAGTTTTTCTACTTTTAAAGACCCCCCCCCCCAACAGAACACTAAACAGACTATTTA
ACTTGAGGGTAATAAACTTAGAATAAAATTGTAAAATTGTATAGAGATATGCAGAAGGAAGGGCATCCTT
CTGCCTTTTTTATTTTTTTAAGCTGTAAAAAGAGAGAAAACTTATTTGAGTGATTATTTGTTATTTGTAC
AGTTCAGTTCCTCTTTGCATGGAATTTGTAAGTTTATGTCTAAAGAGCTTTAGTCCTAGAGGACCTGAGT
CTGCTATATTTTCATGACTTTTCCATGTATCTACCTCACTATTCAAGTATTAGGGGTAATATATTGCTGC
TGGTAATTTGTATCTGAAGGAGATTTTCCTTCCTACACCCTTGGACTTGAGGATTTTGAGTATCTCGGAC
CTTTCAGCTGTGAACATGGACTCTTCCCCCACTCCTCTTATTTGCTCACACGGGGTATTTTAGGCAGGGA
TTTGAGGAGCAGCTTCAGTTGTTTTCCCGAGCAAAGTCTAAAGTTTACAGTAAATAAATTGTTTGACCAT
GCCTTCATTGCAAAAAAAAAAAAAAAAA
EOF


sub  _not_study {
    $str =~ /GACGTC/g ;    # Act II
    $str =~ /CGCG/g ;      # Acc II
    $str =~ /TCCGGA/g ;    # Acc III
    $str =~ /GTAC/g ;      # Afa I
    $str =~ /CTTAAG/g ;    # Afl II
    $str =~ /ACCGGT/g ;    # Age I
}

sub _study {
    study $str ;
    $str =~ /GACGTC/g ;
    $str =~ /CGCG/g ;
    $str =~ /TCCGGA/g ;
    $str =~ /GTAC/g ;
    $str =~ /CTTAAG/g ;
    $str =~ /ACCGGT/g ;
}

use Benchmark qw(:all) ;
cmpthese(timethese (undef, {
    '1'  => '_not_study',
    '2' => '_study',
}));
```

配列は[これ](http://www.ncbi.nlm.nih.gov/nuccore/283483994?report=fasta)

```
$ perl test.pl
Benchmark: running 1, 2 for at least 3 CPU seconds...
         1:  3 wallclock secs ( 3.29 usr +  0.00 sys =  3.29 CPU) @ 88551.37/s (n=291334)
         2:  4 wallclock secs ( 3.16 usr +  0.00 sys =  3.16 CPU) @ 189139.87/s (n=597682)
      Rate    1    2
1  88551/s   -- -53%
2 189140/s 114%   --
```

### 次世代シーケンサー
のデータとかでも効果的だったら、良かったのに。

```
$ perl -lne 'next if $. % 4 != 2 ; $a += length $_ }{ print $a' test.fastq
2529714200
```

```
$ time perl -lne 'next if $. % 4 != 1 ; /AGATCGGAAGAGC/g; /GCTCTTCCGATCT/g' test.fastq
real 39.85s
user 37.68s
sys 2.09s
$ time perl -lne 'next if $. % 4 != 1 ; study; /AGATCGGAAGAGC/g; /GCTCTTCCGATCT/g' test.fastq
real 50.30s
user 47.82s
sys 2.38s
```

残念ながら、検索文字列が少ないと返って遅くなるという、いい例でした[^1]。

[^1]: `study;` の挿入位置やら変えてみたけど、そこらは割愛。