-> 06 { 09 / 27 }
ruby で schwartzian 変換
ああそっか、記述見かけないと思ったらクイックソートだから必要ないの、か?
require 'benchmark/runner' require 'digest/sha1' class SortBench < Benchmark::Runner def setup @ary = (1..10000).to_a.map{|i| i.to_s} end def normal @ary.sort_by {|i| Digest::SHA1.hexdigest(i) } end def schwartzian @ary.map {|i| [i, Digest::SHA1.hexdigest(i)] }.sort_by {|i| i.last}.map {|i| i.first} end end SortBench.run 10
結果
user system total real
schwartzian 0.840000 1.330000 2.170000 ( 2.168033)
normal 0.720000 0.870000 1.590000 ( 1.589423)
しゅなんとか変換かますと遅い。
トラックバック - http://subtech.g.hatena.ne.jp/secondlife/20060927
http://neta.ywcafe.net/000544.html
所詮データのアウトプット直前の構造は高速に取得できるでしょうから、アウトプット形式が様々な物に対応していて柔軟な方がよさそうですね。
'paragraphs'ってオプションがあるみたいですよ!
:h paragraphs
デフォルトは"IPLPPPQPP LIpplpipbp"だそうで。なんのこっちゃ・・・・
調べていじればできそうですね。
Enumerable#sort_byのマニュアルに載ってますが、sort_byは
map {|i| i.hoge }.sort {|a,b| a <=> b }.map {|i| i.hoge }
とほぼ同じ意味ですので(少し早い)後者のコードはあまり意味がないようです。
明示的にschwartzian transformを行なう際は、sort_byでやるよりはsortを使った方が余分な動作がない分早いのではないかと思われます。ただ基本的にはsort_by {|i| .. }で十分のようです。
http://www.ruby-lang.org/ja/man/?cmd=view;name=Enumerable
'paragraphs'はviからある古いオプションで、nroffのマクロを指定することしかできないようです。
http://d.hatena.ne.jp/parasporospa/20060722/1153564681