加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

在Perl中访问字符串中的单个字符时,是否更快地进行子网划分或拆

发布时间:2020-12-15 21:52:57 所属栏目:大数据 来源:网络整理
导读:我正在编写一个Perl脚本,我需要在其中循环遍历字符串的每个字符.有很多字符串,每个字符串长100个字符(如果你想知道的话,它们是短的DNA序列). 那么,使用substr一次提取一个字符是否更快,或者将字符串拆分为数组然后迭代数组更快? 在我等待答案时,我想我会读
我正在编写一个Perl脚本,我需要在其中循环遍历字符串的每个字符.有很多字符串,每个字符串长100个字符(如果你想知道的话,它们是短的DNA序列).

那么,使用substr一次提取一个字符是否更快,或者将字符串拆分为数组然后迭代数组更快?

在我等待答案时,我想我会读到如何在Perl中对事物进行基准测试.

解决方法

这实际上取决于你对数据做了什么 – 但是,嘿,你的最后一个问题正朝着正确的方向发展!不要猜,基准.

Perl为这类东西提供了Benchmark模块,使用它非常简单.这是一个开始使用的示例代码:

#!/usr/bin/perl
use strict;
use warnings;
use Benchmark qw(cmpthese);

my $dna;
$dna .= [qw(G A T C)]->[rand 4] for 1 .. 100;

sub frequency_substr {
  my $length = length $dna;
  my %hist;

  for my $pos (0 .. $length) {
    $hist{$pos}{substr $dna,$pos,1} ++;
  }

  %hist;
}

sub frequency_split {
  my %hist;
  my $pos = 0;
  for my $char (split //,$dna) {
    $hist{$pos ++}{$char} ++;
  }

  %hist;
}

sub frequency_regmatch {
  my %hist;

  while ($dna =~ /(.)/g) {
    $hist{pos($dna)}{$1} ++;
  }

  %hist;
}


cmpthese(-5,# Run each for at least 5 seconds
  { 
    substr => &;frequency_substr,split => &;frequency_split,regex => &;frequency_regmatch
  }
);

并得到一个样本结果:

Rate  regex  split substr
regex  6254/s     --   -26%   -32%
split  8421/s    35%     --    -9%
substr 9240/s    48%    10%     --

原来,substr的速度惊人.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读