Я предполагаю, что это будет означать реализацию map
по-другому? This question имеет дело с такой задачей. Я включил тесты ответов от @ JörgWMittag и @uishra. Хотя должно быть сказано, что speed
не является обязательным в связанном вопросе, поэтому ответы не могут быть подвергнуты критике в этом отношении. Я также включил ответ @ CarySwoveland на этот вопрос.
require 'fruity'
require 'matrix'
class Array
#jörg_w_mittag
def new_map
return enum_for(__callee__) unless block_given?
inject([]) {|acc, el| acc << yield(el) }
end
#uishra
def my_map(&block)
result = []
each do |element|
result << block.call(element)
end
result
end
#cary_swoveland
def vec_map(k)
(Vector[*[k]*self.size] + Vector[*self]).to_a
end
end
arr = (1..30000).to_a
k = 3
10.times do
compare do
core_map { ar = arr.dup; ar.map { |n| n + k } }
jörg_w_mittag { ar = arr.dup; ar.new_map { |n| n + k } }
uishra { ar = arr.dup; ar.my_map { |n| n + k } }
cary_swoveland { ar = arr.dup; ar.vec_map k }
end
puts
end
Краткое изложение результатов/вывода:
Результаты по пять раз
#Running each test once. Test will take about 1 second.
#core_map is faster than jörg_w_mittag by 2x ± 1.0
#jörg_w_mittag is similar to uishra
#uishra is similar to cary_swoveland
Результаты в двух случаях
#Running each test once. Test will take about 1 second.
#core_map is faster than jörg_w_mittag by 2x ± 0.1
#jörg_w_mittag is similar to uishra
#uishra is similar to cary_swoveland
Результаты по три раза
#Running each test once. Test will take about 1 second.
#core_map is faster than uishra by 2x ± 1.0
#uishra is similar to jörg_w_mittag
#jörg_w_mittag is similar to cary_swoveland
Кажется ядро 'map' выигрывает день. Теперь вопрос заключается в том, какая реализация Ruby имеет самую быструю «карту»? –