Ich denke, es würde bedeuten, map
auf andere Weise zu implementieren? This question beschäftigt sich mit einer solchen Aufgabe. Ich habe Benchmarks der Antworten von @ JörgWMittag und @uishra aufgenommen. Obwohl es gesagt werden muss speed
war keine Anforderung in der verknüpften Frage, so dass die Antworten in dieser Hinsicht nicht kritisiert werden können. Ich habe auch @ CarySwovelands Antwort von dieser Frage eingeschlossen.
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
Eine Zusammenfassung der Ergebnisse/Ausgabe:
Ergebnisse bei fünf Gelegenheiten
#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
Ergebnisse bei zwei Gelegenheiten
#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
Ergebnisse bei drei Gelegenheiten
#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
scheint der Kern 'map' den Tag gewinnt. Die Frage scheint nun nun zu sein, welche Implementierung von Ruby die schnellste 'Karte' hat? –