List::Utilで配列をシャッフルする

こないだ、List::Utilshuffleがあるのを教えて貰ったので、
さっそく使ってみようと思う。(*1)

コードはこんな感じ。

use strict;
use warnings;
use v5.10;

use List::Util qw/shuffle/;
use Array::Shuffle qw/shuffle_array/;
use Benchmark qw/cmpthese/;

cmpthese( 5, {
    Array_Shuffle => sub {
        my @foo = 1..1_000_000;
        shuffle_array( @foo );
    },
    List_Util => sub {
        my @foo = shuffle( 1..1_000_000 );
    }
} );

実行結果はこんな感じ。

$ perl aaa.pl 
                Rate     List_Util Array_Shuffle
List_Util     2.72/s            --          -27%
Array_Shuffle 3.70/s           36%            --

コード書いてる時点で気付いたけど、
List::Utilの方は結果を受け取る分、ちょっと遅い。
でも現時点で、シャッフルする理由はソートの前準備だけなので、
CoreモジュールであるList::Utilの方を、積極的に使っていきたいと思う。

うーん、Array::Shuffleを使った方が良いケースかー、
ちょっと、思い付かないですね。
ちりも積もれば何とかっていう環境では使われてるんですかね?

おしまい。

(*1) akiymさん++

Leave a Comment