Ich versuche, dies so weit wie möglich zu vereinfachen.while-loop schneller als für die Rückkehr Iterator
Funktionen f1
und f2
eine sehr vereinfachte Version eines roulette wheel selection über einen Vektor R
implementieren. Der einzige Unterschied zwischen ihnen ist, dass f1
eine für und f2
eine Weile verwendet. Beide Funktionen geben den Index des Arrays zurück, in dem die Bedingung erfüllt war.
R=rand(100)
function f1(X::Vector)
l = length(X)
r = rand()*X[l]
for i = 1:l
if r <= X[i]
return i
end
end
end
function f2(X::Vector)
l = length(X)
r = rand()*X[l]
i = 1
while true
if r <= X[i]
return i
end
i += 1
end
end
jetzt habe ich ein paar Testfunktionen ... M
die Anzahl der Male ist, dass wir die Funktion Ausführung wiederholen.
Jetzt ist dies kritisch ... Ich möchte die Werte speichern, die ich von den Funktionen bekomme, weil ich sie später brauche ... Um den Code zu vereinfachen, habe ich gerade eine neue Variable r
erstellt, wo ich die Rückgaben von den Funktionen zusammenfasse . So
function test01(M,R)
cumR = cumsum(R)
r = 0
for i = 1:M
a = f1(cumR)
r += a
end
return r
end
function test02(M,R)
cumR = cumsum(R)
r = 0
for i = 1:M
a = f2(cumR)
r += a
end
return r
end
neben ich:
@time test01(1e7,R)
elapsed time: 1.263974802 seconds (320000832 bytes allocated, 15.06% gc time)
@time test02(1e7,R)
elapsed time: 0.57086421 seconds (1088 bytes allocated)
also aus irgendeinem Grund kann ich nicht herausfinden, f1
ordnet eine Menge Speicher und seine noch größer, je größer M
bekommt. Ich sagte die Zeile r += a
war kritisch, denn wenn ich es aus beiden Testfunktionen entferne, bekomme ich das gleiche Ergebnis mit beiden Tests, also keine Probleme! Also dachte ich, es gibt ein Problem mit dem Typ a
, der von den Funktionen zurückgegeben wird (weil f1
den Iterator der for-Schleife zurückgibt, und f2
verwendet eine eigene Variable i
"manuell deklariert" innerhalb der Funktion).
Aber ...
aa = f1(cumsum(R))
bb = f2(cumsum(R))
typeof(aa) == typeof(bb)
true
Also ... was die Hölle los ist ???
Ich entschuldige mich, wenn dies eine Art von grundlegender Frage ist, aber ich habe das jetzt über 3 Stunden durchgegangen und konnte keine Antwort finden ... Auch wenn die Funktionen mit einer While-Schleife behoben werden hasse es nicht zu wissen, was vor sich geht.
Danke.
Ihre Funktionen sind nicht deterministisch .. beide 'f1' und' f2' enthalten 'r = rand() * X [l]' und 'r' ist das Stoppkriterium. Wenn Sie die Timings fair machen wollen, übergeben Sie 'r' als Parameter und erstellen Sie einen Vektor mit einem anderen 'r', um die Geschwindigkeit zu testen. –
'f2' überspringt das Testen für das Ende von' X' Vektor. Es spart Zeit, aber Unfug in 'X' könnte Out-of-Bound-Ausnahme verursachen. Auf der anderen Seite kann 'f1' ein '@ inbounds' vor der 'for'-Anweisung hinzufügen, da der Index sicher ankommend ist. Diese Änderungen reduzieren die Geschwindigkeitsdiskrepanz zwischen den Versionen. –
@DanGetz Danke, ich habe '@ inbounds' hinzugefügt und die Geschwindigkeitsdiskrepanz wurde reduziert, aber das Speicherzuweisungsproblem besteht immer noch. – Esteban