Wie schreibe ich guten Julia-Code, wenn ich mit mehreren Typen und Arrays zu tun habe?
Ich bin neu in Julia und habe aufgrund meiner Matlab-Herkunft einige Schwierigkeiten, zu bestimmen, wie man "guten" Julia-Code schreibt, der die Vorteile des Mehrfachversands und des Typensystems von Julia nutzt.
Betrachten Sie den Fall, in dem ich eine Funktion habe, die das Quadrat von a liefertFloat64
. Ich könnte dies schreiben als:
function mysquare(x::Float64)
return(x^2);
end
Manchmal möchte ich das ganze QuadratFloat64
s in einem eindimensionalen Array, möchten aber keine Schleife überschreibenmysquare
Jedes Mal, also benutze ich mehrere Versandarten und füge Folgendes hinzu:
function mysquare(x::Array{Float64, 1})
y = Array(Float64, length(x));
for k = 1:length(x)
y[k] = x[k]^2;
end
return(y);
end
Aber jetzt arbeite ich manchmal mitInt64
Deshalb schreibe ich zwei weitere Funktionen heraus, die den Mehrfachversand nutzen:
function mysquare(x::Int64)
return(x^2);
end
function mysquare(x::Array{Int64, 1})
y = Array(Float64, length(x));
for k = 1:length(x)
y[k] = x[k]^2;
end
return(y);
end
Ist das richtig? Oder gibt es eine ideologischere Möglichkeit, mit dieser Situation umzugehen? Soll ich solche Typparameter verwenden?
function mysquare{T<:Number}(x::T)
return(x^2);
end
function mysquare{T<:Number}(x::Array{T, 1})
y = Array(Float64, length(x));
for k = 1:length(x)
y[k] = x[k]^2;
end
return(y);
end
Das fühlt sich sinnvoll an, aber wird mein Code so schnell ausgeführt wie in dem Fall, in dem ich parametrische Typen vermeide?
Zusammenfassend gibt es zwei Teile meiner Frage:
Wenn mir schneller Code wichtig ist, sollte ich parametrische Typen wie oben beschrieben verwenden oder mehrere Versionen für verschiedene konkrete Typen schreiben? Oder soll ich etwas ganz anderes machen?
Wenn ich eine Funktion möchte, die sowohl mit Arrays als auch mit Skalaren arbeitet, empfiehlt es sich, zwei Versionen der Funktion zu schreiben, eine für den Skalar und eine für das Array. Oder sollte ich etwas ganz anderes machen?
Schließlich weisen Sie bitte auf andere Probleme hin, die Sie im obigen Code sehen können, da es mein oberstes Ziel hier ist, guten Julia-Code zu schreiben.
OP UPDATE: Beachten Sie, dass in der neuesten Version von Julia (v0.5) der idiomatische Ansatz zur Beantwortung dieser Frage darin besteht, nur zu definierenmysquare(x::Number) = x^2
. Der vektorisierte Fall wird durch automatisches Senden abgedeckt, d.h.x = randn(5) ; mysquare.(x)