Habe einige schnelle, schmutzige Benchmarks für einige der gegebenen Antworten durchgeführt. (Diese Ergebnisse sind möglicherweise nicht genau identisch mit Ihren, basierend auf der Ruby-Version, dem seltsamen Caching usw., aber die allgemeinen Ergebnisse sind ähnlich.)
arr
ist eine Sammlung von ActiveRecord-Objekten.
Benchmark.measure {
100000.times {
Hash[arr.map{ |a| [a.id, a] }]
}
}
Benchmark @ 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] }]
}
}
Benchmark @ 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 }
}
}
Benchmark @ 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 }
}
}
Benchmark @ real = 1.650568, @ cstime = 0.0, @ cutime = 0.0, @ stime = 0.12999999999999998, @ utime = 1.51, @ total = 1.64
Abschließend
Nur weil Ruby ausdrucksstark und dynamisch ist, heißt das nicht, dass Sie sich immer für die schönste Lösung entscheiden sollten. Die Basis jeder Schleife war die schnellste beim Erstellen eines Hash.
... { |v| [v, f(v)] }
, aber das hat den Trick gemacht!