Какой быстрый способ извлечь массив вложенных объектов из массива объектов в Ruby?> - PullRequest
2 голосов
/ 30 июня 2010

У меня есть массив Elements, и у каждого элемента есть свойство: image.

Я хотел бы получить массив изображений: каков самый быстрый и наименее дорогой способ добиться этого.Это просто итерация по массиву и вставка каждого элемента в новый массив, что-то вроде этого:

images = []
elements.each {|element| images << element.image}

Ответы [ 2 ]

5 голосов
/ 30 июня 2010
elements.map {|element| element.image}

Это должно иметь примерно ту же производительность, что и ваша версия, но несколько более кратко и более идиоматично.

3 голосов
/ 30 июня 2010

Вы можете использовать Benchmark module для проверки такого рода вещей. Я запустил версию @ sepp2k против вашего исходного кода, например:

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

Вывод на моей машине был последовательно (после более чем 3 прогонов) очень близок к этому:

   user     system      total        real
2.140000   0.000000   2.140000 (  2.143290)
1.420000   0.010000   1.430000 (  1.422651)

Таким образом, демонстрируется, что map значительно быстрее, чем ручное добавление в массив, когда массив несколько большой и операция выполняется много раз.

...