mieki256's diary



2014/06/10(火) [n年前の日記]

#1 [ruby] 配列に入ってる整数を全て実数にしたい

Ruby で、配列に入った値を整数から実数にしたいときがあるのですけど。今まで以下のように書いてたわけで。
  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メソッドは、配列の配列を平坦化した新しい配列を返します。配列中に含まれる配列からすべて要素を取り出して、親の配列の中に並べます。

flatten, flatten! (Array) - Rubyリファレンス より


_map, map! (Array) - Rubyリファレンス
mapメソッドは、要素の数だけ繰り返しブロックを実行し、ブロックの戻り値を集めた配列を作成して返します。collectメソッドの別名です。

map, map! (Array) - Rubyリファレンス より


しかし、ベンチマークを取ってみたら、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倍遅いのかな。見た目アホっぽく、ベタッと書いたほうが、まだ速い場面もあるのだなと…。

もっと違う書き方はできないかしら。

以上です。

過去ログ表示

Prev - 2014/06 - Next
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project