2016-03-22 2 views
9

In Julia habe ich eine Funktion für eine komplizierte Simulation, monte_carlo_sim(), die viele Parameter enthält. Innerhalb dieser Funktion muss ich viele andere Funktionen aufrufen. Ich könnte stand-alone-Funktionen außerhalb von monte_carlo_sim() schreiben, aber dann würde ich viele Parameter übergeben müssen - von denen viele innerhalb dieser Funktion konstant sind -, die Eleganz und Klarheit opfern würden (und vielleicht die Tatsache nicht ausnutzen) dass dies konstante Variablen sind?). Gibt es einen Leistungsgrund, Funktionen nicht in Funktionen einzuschließen? Als ein Spielzeugbeispiel hier ist die Temperatur T konstant, und wenn ich diese Variable nicht an meine Funktion compute_Boltzmann() übergeben möchte, könnte ich Folgendes tun. Ist da etwas nicht in Ordnung?Funktionen innerhalb einer Funktion in Julia

function monte_carlo_sim(temp::Float64, N::Int) 
    const T = temp 

    function compute_Boltzmann(energy::Float64) 
     return exp(-energy/T) 
    end 

    # later call this function many times 
    for i = 1:1000 
     energy = compute_energy() 
     b = compute_Boltzmann(energy) 
    end 
end 

Alternativ könnte ich einen neuen const Typ SimulationParameters und übergeben diese an compute_Boltzmann statt, definieren und zu schreiben compute_Boltzmann außerhalb der monte_carlo_sim Funktion als here? Ist das besser? Ich würde jedoch mehr Informationen weitergeben, als ich in diesem Fall brauchen würde.

Antwort

2

Da Google führte mich hier vielleicht füge ich einen Kommentar:

Verschachtelte Funktionen langsamer sein, siehe zum Beispiel this discussion auf Github ... im Jahr 2013 aber nicht mehr: Läuft die Tests genau dort auf v0.6, sie sind jetzt alle gleich schnell.

Dies gilt immer noch für mich, wenn (wie die Frage) die innere Funktion implizit von Dingen abhängt, die in der äußeren Funktion definiert sind, die explizit übergeben werden müsste, wenn es eine freistehende Funktion wäre.

2

Wie Sie erwähnt haben, ist Code Klarheit sehr wichtig, so dass Sie sich darauf konzentrieren sollten, auf den ersten Platz. Wenn Sie das Gefühl haben, Funktionen innerhalb von Funktionen zu haben, ist Ihr Stil und hilft Ihnen (und Ihren Kollegen), Ihr Skript besser zu verstehen, als Sie es tun. In Bezug auf die Leistung können Sie die beiden Implementierungen immer mit dem Makro @time vergleichen. Ich würde nicht erwarten, dass Ihre Funktionen in der Funktionsimplementierung leiden, aber es ist immer eine Überprüfung wert.

Weitere Informationen zur Verwendung von @time und Schreiben von Hochleistungscode finden Sie im Artikel here.