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 QuadratFloat64s 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 mitInt64Deshalb 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)

Antworten auf die Frage(1)

Ihre Antwort auf die Frage