dogwood008の開発メモ!

最近のマイブームは機械学習, Ruby on Rails。中でも機械学習を使った金融商品の自動取引に興味があります。

【Ruby】Hash#fetchがデフォルト値を取る時、ブロックを与える方がパフォーマンスが良い

要旨

ブロックを使うのがおすすめ。

詳細

Hash#fetch は、Hashに指定したKeyが存在する際に、そのValueを返すメソッドである。

このメソッドは、指定したKeyが存在しなかった際、デフォルト値を返すことができる。その際、デフォルト値の与え方は下記の2通りある。

  • fetch(key, default_value)
  • fetch(key) { |key| default_value }

結論を先に言うと、2つ目のブロックを与える方がパフォーマンスが良くなる傾向があると言える。

1つ目は、fetchメソッドに値が渡る際、第2引数のdefault_valueが評価された後で渡る。したがって、Hash内にkeyが存在していた場合、default_valueの計算に要したリソースは全て無駄になる。

一方、2つ目はkeyがHash内に存在していなかった場合になって初めて評価される。なので、重たい処理がdefault_valueに相当する場合、ブロックで渡すことが推奨される。

なお、keyがHashに存在していなかった場合、どちらもdefault_valueが必要になるため、必要な計算リソースは変わらず、ほぼ変わらないパフォーマンスになると思われる。

参考

docs.ruby-lang.org