Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

Rubyの連想配列...何?

配列に大量のデータがあるが、ハッシュの場合と同じようにキー/値のルックアップを実行する必要があったことがありますか?幸い、Rubyは、配列をKey-Value構造として扱うためのメカニズムを提供します。ぜひチェックしてみてください!

Array#assocの紹介 およびArray#rassoc

あなたが魔法の株選び機を与えられたと想像してみてください。数分ごとに、株を売買するための推奨事項を吐き出します。あなたはそれをあなたのコンピュータに接続し、次のようなデータのストリームを受信することに成功しました:

picks = [
  ["AAPL", "buy"],
  ["GOOG", "sell"],
  ["MSFT", "sell"]
]

Googleの最新のガイダンスを見つけるには、Array#assocを利用できます。 方法。次のようになります:

# Returns the first row of data where row[0] == "GOOG"
picks.assoc("GOOG") # => ["GOOG", "sell"]

最新の「販売」の推奨事項を見つけるには、Array#rassocを使用できます。 メソッド。

# Returns the first row of data where row[1] == "sell"
picks.rassoc("sell") # => ["GOOG", "sell"]

一致するものが見つからない場合、メソッドはnilを返します:

picks.assoc("CSCO") # => nil
picks.rassoc("hold") # => nil
履歴データ

ハッシュは、1つのキーに対して複数の値を持つことはできません。ただし、配列には必要な数の複製を含めることができます。この場合、assocメソッドとrassocメソッドは適切な処理を実行し、最初に一致する行を返します。これにより、非常に興味深いことができます。

私たちの架空の株ピッキングマシンは、データのストリームを提供します。最終的には、特定の会社についての考えが変わり、以前に販売するように言われたものを購入するように言われます。その場合、データは次のようになります。

picks = [
  ["GOOG", "buy"],
  ["AAPL", "sell"],
  ["AAPL", "buy"],
  ["GOOG", "sell"],
  ["MSFT", "sell"]
]

このすべてのデータをハッシュに入れていた場合、特定の株式の推奨を更新すると、その株式の以前の推奨が失われます。アレイではそうではありません。 Array#assocが常に最新の推奨事項を提供することを知っているので、アレイに推奨事項を追加し続けることができます。

# Returns the first row of data where row[0] == "GOOG"
picks.assoc("GOOG") # => ["GOOG", "buy"]

そのため、無料の監査証跡とともに、ハッシュのKey-Valueの良さを得ることができます。

2列以上

assocのもう1つの優れた点は、配列ごとに2列だけに制限されていないことです。列はいくつでも持つことができます。各購入/販売の推奨事項にタイムスタンプを追加したとします。

picks = [
  ["AAPL", "buy", "2015-08-17 12:11:55 -0700"],
  ["GOOG", "sell", "2015-08-17 12:10:00 -0700"],
  ["MSFT", "sell", "2015-08-17 12:09:00 -0700"]
]

ここで、assocを使用すると またはrassoc 、タイムスタンプも取得します:

# The entire row is returned
picks.assoc("GOOG") # => ["GOOG", "sell", "2015-08-17 12:10:00 -0700"]

CSVや、多数の列を持つ可能性のあるその他のファイル形式のデータを処理するときに、これがどれほど役立つかを理解していただければ幸いです。

速度

Rubyのハッシュは間違いなくArray#assocよりも優れています ほとんどのベンチマークで。データセットが大きくなると、違いがより明確になります。結局のところ、ハッシュテーブル検索はO(1)であり、配列検索はO(n)です。ただし、場合によっては、違いが心配するほど大きくないことがあります。詳細によって異なります。

楽しみのために、10行のデータセットと100,000行のデータセットのハッシュルックアップとassocを比較する簡単なベンチマークを作成しました。予想どおり、ハッシュと配列は小さなデータセットでも同様に実行されました。大規模なデータセットでは、ハッシュがアレイを支配していました。

...公平を期すために、配列の最後の要素を検索しています。これは、配列検索の最悪のシナリオです。

require 'benchmark/ips'
require 'securerandom'

Benchmark.ips do |x|
  x.time = 5
  x.warmup = 2

  short_array = (0..10).map { |i| [SecureRandom.hex(), i] }
  short_hash = Hash[short_array]
  short_key = short_array.last.first

  long_array = (0..100_000).map { |i| [SecureRandom.hex(), i] }
  long_hash = Hash[long_array]
  long_key = short_array.last.first

  x.report("short_array") { short_array.assoc(short_key) }
  x.report("short_hash") { short_hash[short_key] }
  x.report("long_array") { long_array.assoc(long_key) }
  x.report("long_hash") { long_hash[long_key] }

  x.compare!
end


# Calculating -------------------------------------
#          short_array    91.882k i/100ms
#           short_hash   149.430k i/100ms
#           long_array    19.000  i/100ms
#            long_hash   152.086k i/100ms
# -------------------------------------------------
#          short_array      1.828M (± 3.4%) i/s -      9.188M
#           short_hash      6.500M (± 4.8%) i/s -     32.426M
#           long_array    205.416  (± 3.9%) i/s -      1.026k
#            long_hash      6.974M (± 4.2%) i/s -     34.828M

# Comparison:
#            long_hash:  6974073.6 i/s
#           short_hash:  6500207.2 i/s - 1.07x slower
#          short_array:  1827628.6 i/s - 3.82x slower
#           long_array:      205.4 i/s - 33950.98x slower


  1. Ruby 2.6のMJITとは何ですか?どのように機能しますか?

    Rubyのパフォーマンスはバージョンごとに大幅に向上しており、Ruby開発チームはRubyをさらに高速化するためにあらゆる努力をしています! これらの取り組みの1つは、3×3プロジェクトです。 目標は? Ruby3.0はRuby2.0の3倍高速になります 。 このプロジェクトの一部は、この記事のトピックである新しいMJITコンパイラです。 MJITの説明 MJITは「メソッドベースのジャストインタイムコンパイラ」の略です。 それはどういう意味ですか? RubyはコードをYARV命令にコンパイルします 、これらの命令はRuby仮想マシンによって実行されます。 JITはこれに別のレ

  2. Ruby on Railsとは何ですか?なぜそれが役立つのですか?

    Ruby on Rails(RoRの場合もある)は、最も人気のあるオープンソースのWebアプリケーションフレームワークです。 Rubyプログラミング言語で構築されています。 Railsを使用すると、単純なものから複雑なものまで、アプリケーションの構築に役立ちます。Railsで実行できることには制限がありません。 フレームワークとは何ですか? フレームワークは、ソフトウェアを作成するときに使用する特定の構造を提供するコード、ツール、およびユーティリティのコレクションです。 この構造により、コードがより整理されます。 正しく使うことを学ぶと、作業が簡単になります。 レールは正確に何を