2015-06-16 23 views
5

Jestem zainteresowana w zrozumieniu rzeczywistą różnicę, jeśli w ogóle, pomiędzy dwóch następujących funkcji definicjepodpisy funkcyjne w julia

function foo(n::Integer) 
    println("hello") 
end 

function foo{T<:Integer}(n::T) 
    println("hello") 
end 

O ile mi zrozumieć drugą formę wyzwala nową kompilację każdym razem funkcję jest wezwany do nowego typu T, ale co tak naprawdę dzieje się w pierwszym przypadku? Czy jest jakiś wpływ na wydajność związaną z pierwszą formą?

Dzięki

Odpowiedz

5

parametrów na argumenty funkcji są dla metody dezambiguacji niż wydajność. Od docs http://docs.julialang.org/en/latest/manual/style-guide/#avoid-writing-overly-specific-types

Kluczową sprawą jest, aby uświadomić sobie, że nie ma kary wydajność do określenia jedynie ogólną addone (x) = x + jeden (x), ponieważ Julia automatycznie skompilować wyspecjalizowane wersje, ile potrzeba. Na przykład, przy pierwszym wywołaniu addone (12), Julia automatycznie skompiluje wyspecjalizowaną funkcję addone dla argumentów x :: Int, a wywołanie funkcji one() zostanie zastąpione jej wartością podkreśloną 1. Dlatego pierwsze trzy definicje addone powyżej są całkowicie zbędne.

EDIT adresowej komentarza:

Różnica pomiędzy tymi dwoma podpisami jest naprawdę tylko pozorna, gdy istnieje więcej niż jeden argument

Rozważmy dwie funkcje:

julia> function foo(n::Integer, m::Integer) 
      println(typeof(n), typeof(m)) 
     end 

julia> function foo{T<:Integer}(n::T, m::T) 
      println("Parameterized: ", typeof(n), typeof(m)) 
     end 

w pierwsza funkcja n i m musi być liczbą całkowitą, ale nie musi być tym samym podtypem liczby całkowitej. W drugiej funkcji, zarówno m i n muszą być tego samego podtypu

julia> foo(1, 2) 
Parameterized: Int64Int64 

julia> foo(1, Int32(1)) 
Int64Int32 
+0

Dzięki, mam swój punkt, ale to tylko część odpowiedzi na moje pytanie. Mój przykład był dość trywialny, przyznaję. Ale widziałem obie formy w bazie Julii i chciałem poznać różnicę między nimi. – Davide

+0

Zaktualizowałem odpowiedź, aby odpowiedzieć na Twój komentarz. – ptb

+0

Tak więc, z jednym argumentem obie formy są równoważne, pierwsza z nich wymaga mniejszego pisania. Dzięki. – Davide