Каков самый быстрый способ вычисления среднего среднего скользящего среднего x в рубине?Каков самый быстрый способ вычисления скользящего среднего массива с Ruby?
У меня есть два массива данных с велосипедной поездки. Время, когда соответствующее значение скорости было прочитано во время поездки. Вы заметите, что показания не принимались каждую секунду. По этой причине я не верю, что могу просто увеличивать скользящий массив на единицу.
speed = [0, 15, 17, 19, 18, 22, 24, 28, 22, 17, 16, 14, 15, 15, 15, 0, 15, 19, 21, 25, 26, 24, 24]
time = [0, 1, 2, 3, 5, 6, 7, 8, 10, 11, 12, 13, 15, 16, 17, 18, 20, 21, 22, 23, 25, 26, 27]
Я пытался что-то вроде следующего (вычисляет качение 5 секунд в среднем и помещает его в массив), но это довольно медленно для больших массивов и множество интервалов (занимает 8 минут, чтобы вычислить все интервалы от А 1 часы езда на велосипеде, 1..3600):
duration = time.max
interval_average = []
time_hash = Hash[time.map.with_index.to_a]
roll_start = 0
roll_stop = 5
for i in 1..(duration+1) do
start = time_hash[roll_start]
stop = time_hash[roll_stop]
rolling_array = speed[start..stop]
avg_value = mean(rolling_array)
interval_average.push(avg_value)
roll_start += 1
roll_stop += 1
end
в моем коде я не обращая внимания на исключения и толкая 0 вместо этого, так как я на самом деле просто заинтересован в поиске Маха х второй усредняет в конец.
'speed [start..stop]' будет выделять суб-массив, что, вероятно, вызывает некоторый существенный трэш GC. Вероятно, ваша цель должна заключаться в том, чтобы устранить распределения, где это возможно; повторное использование промежуточных массивов даст существенные преимущества. –
@ChrisHeald Я сомневаюсь, что ассигнования здесь являются преступниками. 'arr = 10_000_000.times.to_a; Benchmark.measure {1_000_000.times {ar [100 ..- 2]}} .real # => 0.17680915212258697' –
Начните с профилирования кода, чтобы узнать, где идет время (например, ruby-prof) –