約 150k 要素のハッシュと 25k 要素の配列があります。キーが配列にないすべての要素を削除するには、新しいハッシュを作成するか、既存のハッシュを変更する必要があります。これが私が今持っているものです:
hash.select {|k,v| array.include?(k)}
new_hash = hash.delete_if {|k,v| !array.include?(k)}
比較が複雑なため、2 つの方法は非常に遅くなります。高速化できる方法はありますか?
約 150k 要素のハッシュと 25k 要素の配列があります。キーが配列にないすべての要素を削除するには、新しいハッシュを作成するか、既存のハッシュを変更する必要があります。これが私が今持っているものです:
hash.select {|k,v| array.include?(k)}
new_hash = hash.delete_if {|k,v| !array.include?(k)}
比較が複雑なため、2 つの方法は非常に遅くなります。高速化できる方法はありますか?
(hash.keys - array).each{|k| hash.delete(k)}
または、これはさらに高速な場合があります。
keys_to_be_removed = {}
hash.each{|k, _| keys_to_be_removed[k] = true}
array.each{|k| keys_to_be_removed[k] = false}
keys_to_be_removed.each{|k, v| hash.delete(k) if v}
ポイントは、配列操作を避け、すべてを可能な限りハッシュで行うことです。