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
-
Ruby 2.6のMJITとは何ですか?どのように機能しますか?
Rubyのパフォーマンスはバージョンごとに大幅に向上しており、Ruby開発チームはRubyをさらに高速化するためにあらゆる努力をしています! これらの取り組みの1つは、3×3プロジェクトです。 目標は? Ruby3.0はRuby2.0の3倍高速になります 。 このプロジェクトの一部は、この記事のトピックである新しいMJITコンパイラです。 MJITの説明 MJITは「メソッドベースのジャストインタイムコンパイラ」の略です。 それはどういう意味ですか? RubyはコードをYARV命令にコンパイルします 、これらの命令はRuby仮想マシンによって実行されます。 JITはこれに別のレ
-
Ruby on Railsとは何ですか?なぜそれが役立つのですか?
Ruby on Rails(RoRの場合もある)は、最も人気のあるオープンソースのWebアプリケーションフレームワークです。 Rubyプログラミング言語で構築されています。 Railsを使用すると、単純なものから複雑なものまで、アプリケーションの構築に役立ちます。Railsで実行できることには制限がありません。 フレームワークとは何ですか? フレームワークは、ソフトウェアを作成するときに使用する特定の構造を提供するコード、ツール、およびユーティリティのコレクションです。 この構造により、コードがより整理されます。 正しく使うことを学ぶと、作業が簡単になります。 レールは正確に何を