Зробив кілька швидких, брудних тестів щодо деяких з поданих відповідей. (Ці висновки можуть бути не зовсім ідентичними вашим на основі версії Ruby, дивного кешування тощо, але загальні результати будуть схожими.)
arr
є колекцією об'єктів ActiveRecord.
Benchmark.measure {
100000.times {
Hash[arr.map{ |a| [a.id, a] }]
}
}
Бенчмарк @ real = 0.860651, @ cstime = 0.0, @ cutime = 0.0, @ stime = 0.0, @ utime = 0.8500000000000005, @ total = 0.8500000000000005
Benchmark.measure {
100000.times {
h = Hash[arr.collect { |v| [v.id, v] }]
}
}
Бенчмарк @ real = 0.74612, @ cstime = 0.0, @ cutime = 0.0, @ stime = 0.010000000000000009, @ utime = 0.740000000000002, @ total = 0.750000000000002
Benchmark.measure {
100000.times {
hash = {}
arr.each { |a| hash[a.id] = a }
}
}
Бенчмарк @ real = 0.627355, @ cstime = 0.0, @ cutime = 0.0, @ stime = 0.010000000000000009, @ utime = 0.6199999999999974, @ total = 0.6299999999999975
Benchmark.measure {
100000.times {
arr.each_with_object({}) { |v, h| h[v.id] = v }
}
}
Бенчмарк @ real = 1.650568, @ cstime = 0.0, @ cutime = 0.0, @ stime = 0.12999999999999998, @ utime = 1.51, @ total = 1.64
На закінчення
Те, що Ruby виразний і динамічний, не означає, що вам слід завжди вибирати найкрасивіше рішення. Основна кожна петля була найшвидшою у створенні хешу.
... { |v| [v, f(v)] }
, але це зробило трюк!