Реактор с рубиновым контуром - PullRequest
2 голосов
/ 28 апреля 2009

У меня есть цикл, который выглядит следующим образом

def slow_loop(array)
 array.each_with_index do |item, i|
   next_item = array[i+1]
   if next_item && item.attribute == next_item.attribute
     do_something_with(next_item)
   end
 end
end

Помимо изменения способа вызова do_something_with, как я могу сделать это лучше?

ТНХ,

-C

приписка

Поскольку представляется, что это операция 'O (n)', здесь, по-видимому, не будет достигнута производительность, поэтому я выбрал ответ, который использует метод ruby, который уже инкапсулирует эту операцию. всем спасибо за помощь

Ответы [ 3 ]

6 голосов
/ 28 апреля 2009

Как уже упоминали другие, вы не собираетесь значительно улучшать производительность, но вы можете сделать это более аккуратно, например:

array.each_cons(2) do |a, b|
  do_something_with(b) if a == b
end
2 голосов
/ 28 апреля 2009

Производительность do_something_with является основным фактором. Все остальное будет микрооптимизацией.

Это должно быть O (n), вы могли бы найти способ избежать окончательной проверки, но это не будет так дорого в общей схеме вещей.

0 голосов
/ 28 апреля 2009

Я склонен согласиться с Гарри в отношении потенциала оптимизации, но его, безусловно, можно написать проще.

prev_attr = nil
my_array.each |item|
  do_something_with(item) if prev_attr and prev_attr == item.attribute
  prev_attr = item.attribute
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...