配列をランダムに並び替える。かっこいいスクリプト
Perlで配列をランダムな順番に並び替えるスクリプトを書いてベンチマーク取ってみた。
環境はActivePerl 5.8
スクリプトは
#!/usr/bin/perl
use strict;
use Benchmark;
my @array=qw(a b c d e f g h i j k l m n);
Benchmark::timethese(50000, {
use_sort=>\&use_sort,
use_foreach=>\&use_foreach,
});
sub use_sort{
my @new= map {$array[$_->[0]]}
sort {$a->[1] <=> $b->[1]}
map {[$_,rand(1)]} 0..$#array;
}
sub use_foreach{
my @new = ();
foreach (0..$#array) {
my $rand = int(rand(@new + 1));
push(@new, $new[$rand]);
$new[$rand] = $array[$_];
}
return @new;
}
結果は、こうなる
C:\dir>perl random.pl Benchmark: timing 50000 iterations of use_foreach, use_sort... use_foreach: 2 wallclock secs ( 2.05 usr + 0.00 sys = 2.05 CPU) @ 24425.99/s(n=50000) use_sort: 5 wallclock secs ( 4.86 usr + 0.00 sys = 4.86 CPU) @ 10290.18/s (n=50000)
Perlメモにもあるforeachとpushを使った方法が速い。それも2倍以上。意外に差がついた。
ただし、個人的に、
my @random = map {$array[$_->[0]]}
sort {$a->[1] <=> $b->[1]}
map {[$_,rand(1)]} 0..$#array;
この書き方にかっこよさを感じてしまう。
最近はCPUも速いし、許してください。