http://anond.hatelabo.jp/20090408034449
リスト内の有無を複数回調べるときの定石は、事前にハッシュに突っ込んでおく方法です。
元のコードはgrep内でリニアサーチをやっているわけですから、ここにハッシュテーブルを使うわけです。
my %key = map { $_ => 1 } @key; my @update = grep { not exists $key{$_} } @items;
ベンチは取っていないですが、多分早いです。
ただ、その分メモリを食いますし、@itemsに対し@keyの方が長大だと、あまり効率が良くないかも知れません。
その場合、ソート済みならバイナリサーチでやってみるとか、そもそもkeyをハッシュで管理するとか、GDBMやsqlite等を使って永続化するとか、keyの入手段階から検討したほうが良いかもしれません。
@itemsから@keyにある要素を除いたリストを@updateとして欲しいのですが、 下記のコードよりも、より高速な記述があれば是非ご教授くださいませ。 my @update = grep { my $a = 1; foreach my $b (@key) { ...
http://anond.hatelabo.jp/20090408034449 リスト内の有無を複数回調べるときの定石は、事前にハッシュに突っ込んでおく方法です。 元のコードはgrep内でリニアサーチをやっているわけですから、...
ありがとうございます。ベンチを取ってみると、ハッシュの方が速かったです。 UPSERT処理SQLの汎用化に使用中なのですが、プロファイルすると結構時間をくっていたので、key設定時まで...