2013/06/09

最大、最小、レンジ、合計、平均は一撃必殺で算出したい

数値のリストがあって、なんらか集計をする場合、最大値、最小値、レンジ、合計、平均の5項目は、だいたいベースメントとしてまとめて出力すると思うのです。

だけど、例えば Statistics::Lite を使ったりすると、それぞれの値に毎度リストを渡して算出するからもったいない。できれば一撃必殺でやっつけたいですよね。

というわけで書きました。

Statistics::Swoop

Statistics::Swoop

使い方は超簡単です。

use Statistics::Swoop;

my $ss = Statistics::Swoop->new([qw/1 2 3 4 5 6 7 8 9 10/]);

print $ss->max;   # 10
print $ss->min;   # 1
print $ss->sum;   # 55
print $ss->avg;   # 5.5
print $ss->range; # 9

速度的には Statistics::Lite で同じことをやるより 180% くらい速いです。

$ perl demos/benchmark.pl
Benchmark: running Lite, Swoop for at least 1 CPU seconds...
      Lite:  1 wallclock secs ( 1.09 usr +  0.00 sys =  1.09 CPU) @ 110.09/s (n=120)
     Swoop:  1 wallclock secs ( 1.07 usr +  0.00 sys =  1.07 CPU) @ 313.08/s (n=335)
       Rate  Lite Swoop
Lite  110/s    --  -65%
Swoop 313/s  184%    --

benchmark のソースはディストリビューションの demos ディレクトリに入れてあります。

サイト内検索