2014/06/10(火) [n年前の日記]
#1 [ruby] 配列に入ってる整数を全て実数にしたい
Ruby で、配列に入った値を整数から実数にしたいときがあるのですけど。今まで以下のように書いてたわけで。
色々ググってたら、こういう書き方もできそうだなと。
_flatten, flatten! (Array) - Rubyリファレンス
_map, map! (Array) - Rubyリファレンス
しかし、ベンチマークを取ってみたら、flatten と map を使った書き方は微妙に遅くて。
微妙に遅いというか、3倍遅いのかな。見た目アホっぽく、ベタッと書いたほうが、まだ速い場面もあるのだなと…。
もっと違う書き方はできないかしら。
x1, y1 = a[0][0].to_f, a[0][1].to_f x2, y2 = a[1][0].to_f, a[1][1].to_f x3, y3 = a[2][0].to_f, a[2][1].to_f x4, y4 = a[3][0].to_f, a[3][1].to_fもっといい書き方ないのかなと。
色々ググってたら、こういう書き方もできそうだなと。
x1, y1, x2, y2, x3, y3, x4, y4 = a.flatten.map {|item| item.to_f }
_flatten, flatten! (Array) - Rubyリファレンス
flattenメソッドは、配列の配列を平坦化した新しい配列を返します。配列中に含まれる配列からすべて要素を取り出して、親の配列の中に並べます。
_map, map! (Array) - Rubyリファレンス
mapメソッドは、要素の数だけ繰り返しブロックを実行し、ブロックの戻り値を集めた配列を作成して返します。collectメソッドの別名です。
しかし、ベンチマークを取ってみたら、flatten と map を使った書き方は微妙に遅くて。
# 配列内の値を実数にする際のベンチマークを測定 require 'benchmark' def hoge(a) x1 = a[0][0].to_f x2 = a[1][0].to_f x3 = a[2][0].to_f x4 = a[3][0].to_f y1 = a[0][1].to_f y2 = a[1][1].to_f y3 = a[2][1].to_f y4 = a[3][1].to_f x1 + x2 + x3 + x4 + y1 + y2 + y3 + y4 end def fuga(a) x1, y1 = a[0][0].to_f, a[0][1].to_f x2, y2 = a[1][0].to_f, a[1][1].to_f x3, y3 = a[2][0].to_f, a[2][1].to_f x4, y4 = a[3][0].to_f, a[3][1].to_f x1 + x2 + x3 + x4 + y1 + y2 + y3 + y4 end def piyo(a) x1, y1, x2, y2, x3, y3, x4, y4 = a.flatten.map {|item| item.to_f } x1 + x2 + x3 + x4 + y1 + y2 + y3 + y4 end dst = [ [160, 100], [320, 20], [600, 460], [100, 300]] n = 1000000 Benchmark.bm do |x| x.report("a[0][0].to_f A: ") { n.times {|i| hoge(dst) } } x.report("a[0][0].to_f B: ") { n.times {|i| fuga(dst) } } x.report("flatten.map: ") { n.times {|i| piyo(dst) } } end
user system total real a[0][0].to_f A: 1.061000 0.000000 1.061000 ( 1.056060) a[0][0].to_f B: 1.139000 0.000000 1.139000 ( 1.143066) flatten.map: 2.870000 0.000000 2.870000 ( 2.872164)
微妙に遅いというか、3倍遅いのかな。見た目アホっぽく、ベタッと書いたほうが、まだ速い場面もあるのだなと…。
もっと違う書き方はできないかしら。
[ ツッコむ ]
以上です。