¿Cuál es la manera más rápida para extraer una serie de objetos anidados entre una variedad de objetos en Ruby?>
-
01-10-2019 - |
Pregunta
I tienen una serie de elementos, y cada elemento tiene una propiedad:. Imagen
Me gustaría una gran variedad de: imágenes, así que cuál es la forma más rápida y menos costosa para lograr esto. ¿Es sólo iteración sobre la matriz y empujar cada elemento en una nueva matriz, algo como esto:
images = []
elements.each {|element| images << element.image}
Solución
Puede utilizar el Benchmark módulo para probar este tipo de cosas. Corrí @ versión de sepp2k en contra de su código original de este modo:
require 'benchmark'
class Element
attr_accessor :image
def initialize(image)
@image = image
end
end
elements = Array.new(500) {|index| Element.new(index)}
n = 10000
Benchmark.bm do |x|
x.report do
n.times do
# Globalkeith's version
image = []
elements.each {|element| image << element.image}
end
end
# sepp2k's version
x.report { n.times do elements.map {|element| element.image} end }
end
La salida en mi máquina fue consistentemente (después de más de 3 carreras) muy cerca de este:
user system total real
2.140000 0.000000 2.140000 ( 2.143290)
1.420000 0.010000 1.430000 ( 1.422651)
Así que demuestra que map
es significativamente más rápido que añadiendo manualmente a una matriz cuando la matriz es algo grande y la operación se realiza muchas veces.
Otros consejos
elements.map {|element| element.image}
Esto debería tener sobre el mismo rendimiento que su versión, pero es algo más breve y más idiomática.