2016-03-22 10 views
9

W Julii, mam funkcję do skomplikowanej symulacji, monte_carlo_sim(), która obejmuje wiele parametrów. Wewnątrz tej funkcji muszę wywoływać wiele innych funkcji. Mógłbym pisać autonomiczne funkcje poza z monte_carlo_sim(), ale wtedy musiałbym przekazać wiele parametrów - z których wiele jest stałych w tej funkcji - które poświęciłyby elegancję i jasność (i być może nie wykorzystałyby faktu że są to zmienne stałe?). Czy istnieje powód, aby nie uwzględniać funkcji w ramach funkcji? Jako zabawny przykład tutaj temperatura T jest stała, a jeśli nie chcę przekazać tej zmiennej do mojej funkcji compute_Boltzmann(), mógłbym wykonać następujące czynności. Czy coś jest z tym nie tak?Funkcje wewnątrz funkcji w 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 

Ewentualnie mógłbym zdefiniować nowy typ const SimulationParameters i przekazać to do compute_Boltzmann zamiast i pisanie compute_Boltzmann poza funkcją monte_carlo_sim jak here? Czy to jest lepsze? W takim razie przekazywałbym więcej informacji, niż bym potrzebował.

Odpowiedz

2

Ponieważ Google doprowadziło mnie tutaj, może dodać komentarz:

zagnieżdżone funkcje wykorzystywane być wolniejszy, patrz na przykład this discussion na github ... w roku 2013. Ale nie dłużej: działa dokładnie tam na testy v0.6, teraz mają tę samą prędkość.

To nadal jest dla mnie prawdziwe, jeśli (podobnie jak pytanie) funkcja wewnętrzna pośrednio zależy od rzeczy zdefiniowanych w ramach funkcji zewnętrznej, które musiałyby być przekazane jawnie, gdyby była funkcją wolnostojącą.

2

Jak już wspomniano, klarowność kodu jest bardzo ważna, więc powinieneś skupić się na tym na pierwszym miejscu. Jeśli uważasz, że funkcje w obrębie funkcji to twój styl i pomaga (i twoim kolegom) lepiej zrozumieć twój skrypt, niż to zrobić. Jeśli chodzi o wydajność, zawsze możesz porównać 2 implementacje za pomocą makra @time. Nie spodziewałbym się, że twoje funkcje w ramach implementacji funkcji będą cierpieć, ale zawsze warto to sprawdzić.

Aby uzyskać więcej informacji na temat korzystania z @time i napisać kod o wysokiej wydajności przeczytaj artykuł here.