2016-10-28 4 views
3

Nach der "performace tips" section of the Julia manual ist es nicht ratsam, mit mehreren Versand verrückt zu werden. Ich bin in eine Situation geraten, in der es scheint, dass ich 3 Parameter für einen Typ brauche, den ich definiere. Dies hängt mit meiner Frage zu using only 1 parameter for 2 possible types zusammen. Ich weiß, ich könnte die Schwierigkeit dort einfach vorge lösen, indem sie einen anderen Parameter verwenden, aber dann mein Typ sieht aus wieJulia: Effizienz von mehreren Parametern

type mytype{R<:Real, S<:Any, T<:Any} 
    x::Matrix{R} 
    y::Dict{Int64, Vector{S}} 
    z::Dict{T, Vector{Int64}} 
end 

Ist dies nicht ratsam, anhand der Begriffe Leistung für mehrere Parameter, die auf Sendung. Funktionen auf mytype würden dann auf den 3 Parametern und den Funktionsargumenten versenden, ist das richtig?

Antwort

5

Es ist in Ordnung. Do so viel Mehrfachversand auf Typen, wie Sie möchten. Dafür ist es da.

Was Sie nicht wirklich wollen; und was dieser Teil der Dokumente bekommen wird, ist zu viel Versand auf Werte. Was Sie tun können, indem Sie einen Wert als Typparameter verwenden.

Das Versenden von Werten hat tendenziell das Problem, dass es (oft) zu dynamischem Versand führt. Dies bedeutet, dass eine Funktion, die eine Funktion aufruft, die einen Wert als Typparameter hat, sich nicht spezialisieren kann, indem sie weiß, welche Funktion sie aufrufen wird. Dies ist eng mit Typ Instabilität verbunden. Es kann eine Menge Optimierer töten und julia langsam wie Python laufen lassen.

Here is ein Beispiel für einige meiner Code, die wohl "zu weit" mit dem Versand auf Wert geht. Es verwendet den Typ , der nur für den Versand auf Wert existiert. Es ist sehr aussagekräftig und sehr prägnant, aber es wird nicht so schnell wie der gleiche Code, Conditionals oder Wörterbuch Lookups statt laufen. (Und das ist ein Kompromiss, ich bin bereit, in diesem Fall zu machen)

Die Docs sind auch dabei, dass Sie nicht Werte als Typparameter auf Ihren benutzerdefinierten Typen speichern sollten. Vor allem, wenn Sie nicht einmal auf sie versenden. Dafür sind Felder da.

+0

Ok danke, ich muss mehr über die Besonderheiten (Typen vs Werte) nachlesen. Hast du bemerkt, dass ich diesmal zwei Fragen gestellt habe;) – mv3

5

Das ist in Ordnung. Hinweis: Sie können nur schreiben dies als:

type mytype{R<:Real, S, T} 
    x::Matrix{R} 
    y::Dict{Int64, Vector{S}} 
    z::Dict{T, Vector{Int64}} 
end 

In den meisten Fällen, in denen Sie eine nicht-triviale Menge an Berechnungen tun, strikte Typisierung (auf Typen) wird für die Leistung gut sein. Wenn die kleinen Funktionen inline aufgerufen werden (in vielen Fällen wird dies automatisch in Version 0.5 getan, aber Sie können es mit @inline helfen), dann gibt es keine Kosten für Funktionsaufrufe und Sie sorgen sich um nichts.

Wie immer, Benchmark es und sehen Sie selbst. Meist kommt das Problem hier aus einer großen Anzahl von Werttypen.

+2

Überspezifizierende oder "streng typisierende" Argumente verbessern die Leistung im Allgemeinen nicht: http://docs.julaulang.org/en/latest/manual/performance-tips/#type-declarations und wird oft davon abgeraten, weil dies der Fall ist mache Code weniger generisch. Verwenden Sie Typdeklarationen für die Verhaltensverteilung und -struktur, nicht für die Leistung. –

+2

Auf Funktionen, ja, Typ Informationen hilft überhaupt nicht beim Versand. Typen sind unterschiedlich: Machen Sie all diese 'Any' und Typ-Inferenz wird nicht gut funktionieren. Stellen Sie Funktionen locker typisiert und strikt ein. –

+0

@Isaiah Warten Sie, ich bin neugierig, sagen Sie zum Beispiel 'Funktion (n :: Int64)' ist nicht besser als 'Funktion (n)' in Bezug auf die Leistung? – mv3