Created
July 8, 2023 06:23
-
-
Save JUNKI555/79f886b42f68372b73656ef17142f3ed to your computer and use it in GitHub Desktop.
Ruby 重複削除スピードテスト
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# ruby uniq speed test : Ruby 2.7.3 | |
# こっちも参考に | |
# https://www.eisbahn.jp/yoichiro/2012/04/ruby_uniq_array.html#gsc.tab=0 | |
# https://zenn.dev/universato/articles/20201210-z-ruby | |
# | |
# | |
# :::::Result: (何回か試行したが大差なかった) | |
# [109] pry(main)> uniq_email_and_user_names | |
# 1.378417334 | |
# => 10 | |
# [110] pry(main)> set_email_and_user_names | |
# 1.60182825 | |
# => 10 | |
# [111] pry(main)> hash_email_and_user_names | |
# 1.365713918 | |
# => 10 | |
# [112] pry(main)> uniq_emails | |
# 0.640594917 | |
# => 10 | |
# [113] pry(main)> set_emails | |
# 1.329802959 | |
# => 10 | |
# [114] pry(main)> hash_emails | |
# 0.972381917 | |
# => 10 | |
# | |
# :::::ChatGPT(3.5)くんからのアドバイス | |
# 処理速度の観点から見ると、uniq_emails関数が最も高速な方法です。これは、Array.uniqが高度に最適化されたアルゴリズムを使用しているためです。 | |
# uniqメソッドは、要素の順序を保持しながら重複を削除します。 | |
# | |
# 一方、set_emails関数はeach_with_objectとSet.newを使用して一意の要素を集めますが、これは比較的遅い方法です。 | |
# Setオブジェクトは重複を許さず、要素の挿入順序を保持しますが、Setオブジェクトに要素を追加する際にハッシュ関数を使用するため、要素の追加には追加の処理時間がかかります。 | |
# | |
# hash_emails関数は、ハッシュを使用して一意の要素を集めますが、Setオブジェクトを使用する方法と比較してさらに遅くなる可能性があります。 | |
# これは、ハッシュ関数の計算やハッシュの衝突の処理が追加されるためです。 | |
# --- | |
# uniq_email_and_user_names関数では、email_and_user_names配列の各要素から[:email]を取り出し、uniqメソッドを使用して重複を削除しています。 | |
# set_email_and_user_names関数では、email_and_user_names配列の各要素から[:email]を取り出し、Setオブジェクトを使用して重複を削除しています。 | |
# hash_email_and_user_names関数では、ハッシュを使用して重複を削除しています。email_and_user_names配列の各要素をループし、temporary_hashという一時的なハッシュに[:email]をキーとして追加します。その後、temporary_hash.keysを使用して重複を削除しています。 | |
# | |
# これらの方法は、いずれもループ処理やマッピングを行っており、要素ごとに操作を行っているため、処理速度に大きな差はありません。 | |
# | |
# :::::以下、コード | |
# email_and_user_names という Hash の配列からemailを取り出してつぶす | |
def uniq_email_and_user_names | |
email_and_user_names = [] | |
1000000.times {|i| email_and_user_names << {email:"#{i/100000}@hoge.com", user_name:"株式会社#{i}"}} | |
s = Time.now | |
result = email_and_user_names.map {|x| x[:email]}.uniq | |
e = Time.now | |
puts e - s | |
result.length | |
end | |
def set_email_and_user_names | |
email_and_user_names = [] | |
1000000.times {|i| email_and_user_names << {email:"#{i/100000}@hoge.com", user_name:"株式会社#{i}"}} | |
s = Time.now | |
result = email_and_user_names.each_with_object(Set.new) { |hash, set| set << hash[:email] }.to_a | |
e = Time.now | |
puts e - s | |
result.length | |
end | |
def hash_email_and_user_names | |
email_and_user_names = [] | |
1000000.times {|i| email_and_user_names << {email:"#{i/100000}@hoge.com", user_name:"株式会社#{i}"}} | |
s = Time.now | |
temporary_hash = {} | |
email_and_user_names.each {|x| temporary_hash[x[:email]] = x[:email]} | |
result = temporary_hash.keys | |
e = Time.now | |
puts e - s | |
result.length | |
end | |
# emails という配列をつぶす | |
def uniq_emails | |
emails = [] | |
1000000.times {|i| emails << "#{i/100000}@hoge.com"} | |
s = Time.now | |
result = emails.uniq | |
e = Time.now | |
puts e - s | |
result.length | |
end | |
def set_emails | |
emails = [] | |
1000000.times {|i| emails << "#{i/100000}@hoge.com"} | |
s = Time.now | |
result = emails.each_with_object(Set.new) { |email, set| set << email }.to_a | |
e = Time.now | |
puts e - s | |
result.length | |
end | |
def hash_emails | |
emails = [] | |
1000000.times {|i| emails << "#{i/100000}@hoge.com"} | |
s = Time.now | |
temporary_hash = {} | |
emails.each {|x| temporary_hash[x] = x} | |
result = temporary_hash.keys | |
e = Time.now | |
puts e - s | |
result.length | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment