« 貴重なVISA所有者 | メイン | AsrockのP4S61へのLinuxインストールメモ »

配列をランダムに並び替える。かっこいいスクリプト

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も速いし、許してください。

トラックバック

この一覧は、次のエントリーを参照しています: 配列をランダムに並び替える。かっこいいスクリプト:

» きもいperl from その辺の空気とか
明日占いを作ろうと思った。 こんなresultがほしいわけよ。 現在の状態 I 魔術師 オモテ wiki 未来の状態 ... [詳しくはこちら]