Итерирование по часам в Ruby в течение 1 месяца занимает 15 секунд. Какой лучший способ итерации по интервалам времени в Ruby? - PullRequest
2 голосов
/ 10 января 2011

Если я итерирую в течение 1 месяца, чтобы сделать что-то для каждого часа, это займет около 14 секунд, используя Range#step:

bm = Benchmark.measure do
  (Time.now..(Time.now + 1.month)).step(1.hour) { |hour| puts hour.inspect }
end
puts bm
=> 14.750000   0.060000  14.810000 ( 14.907838)

Это потому, что он повторяется каждую [секунду]?Как лучше всего создавать и повторять интервалы времени для каждого часа с начала часа?

range == [...Wed Feb 09 11:00:00 -0600 2011, Wed Feb 09 12:00:00 -0600 2011, ...]

Ответы [ 4 ]

4 голосов
/ 10 января 2011

Это может быть альтернативой.Кажется, по крайней мере, намного быстрее.

bm = Benchmark.measure do
  time = Time.now
  while time < (Time.now + 1.month)
    puts time.inspect
    time += 1.hour
  end
end
puts bm
=> 0.483000   0.000000   0.483000 (  0.546000)
2 голосов
/ 10 января 2011
t = Time.now
0.upto(1.month/1.hour) {|i| puts t+i*1.hour}

Примечание. Предполагается, что для 1.month и 1.hour требуется activesupport.Также это дает вам месяцы постоянного размера (2592000 секунд), что довольно ограничивает его полезность.

0 голосов
/ 02 января 2013

Вот кое-что, что я написал, чтобы перебирать дни в рельсах.

def each_day(range, &block)
  values = []
  (range.first.to_i .. range.last.to_i).step(1.day) { |d| values << Time.at(d) }
  return values unless block_given?
  values.each { |val| yield(val) }
end

range = (Time.local(2012, 12, 31) .. Time.local(2013, 1, 1))

each_day(range) { |d| puts d.inspect }
0 голосов
/ 10 января 2011

Ну, месяц не постоянный.Вам также приходится иметь дело с переходом на летнее время и т. Д. Таким образом, чтобы выполнить итерацию более месяца (или любого промежутка времени) по часам быстрее и точнее:

bm = Benchmark.measure do
  s_time = Time.local(2011,1,1)
  e_time = Time.local(2011,2,1)
  while(s_time < e_time)
    puts s_time.inspect
    s_time += 3600
  end
end

puts bm

0.010000   0.000000   0.010000 (  0.010531)

Если вы хотите, чтобы часы отображались только в верхней части часамежду произвольными временами:

 s_time += s_time.to_i % 3600
 e_time -= e_time.to_i % 3600
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...