2015-05-09 9 views
5

Sto dando Julia un andare e risolvere i problemi Code Jam, in questo caso Rope Intranet da 1C rotondo 2010 (https://code.google.com/codejam/contest/619102/dashboard)Julia file di input velocità di lettura

Solution è fondamentalmente:

for tc = 1:int(readline()) 
    n = int(readline()) 
    a = [map(int, split(readline())) for _ = 1:n] 
    ans = 0 

    for (i, x) in enumerate(a) 
     for y in a[i + 1:end] 
      ans += (x[1] - y[1]) * (x[2] - y[2]) < 0 
     end 
    end 

    println("Case #", tc, ": ", ans) 
end 

Tuttavia, risultati in tempo per il grande ingresso non sono molto impressionanti confronto con soluzioni in C++ e Python:

julia 
real 0m6.196s 
user 0m6.028s 
sys  0m0.373s 

c++ 
real 0m0.392s 
user 0m0.338s 
sys  0m0.053s 


pypy 
real 0m0.529s 
user 0m0.507s 
sys  0m0.016s 

situazione cambia, quando sostituisco ingresso file con numeri casuali (ancora più lento di C++ però):

julia 
real 0m3.065s 
user 0m2.868s 
sys  0m0.338s 

c++ 
real 0m1.413s 
user 0m1.348s 
sys  0m0.055s 

pypy 
real 0m22.491s 
user 0m22.257s 
sys  0m0.160s 

C'è un modo per ottimizzare i tempi di lettura del file a Julia (sto usando v0.3.7)?

risposta

8

Quindi il mio tempo di riferimento sulla grande ingresso (time cat A-large-practice.in | julia original.jl) era

real 0m2.730s 
user 0m2.683s 
sys  0m0.351s 

Sul mio sistema ci vogliono Julia circa 0,2 secondi per avviare l'esecuzione del file. Mettere il codice in una funzione è probabilmente il primo passo più importante - questo significa che tutto non è globale, il che può danneggiare le prestazioni a causa del conflitto di inferenza di tipo. Questo mi ha portato a real 2.044s.

Il secondo problema è in realtà un difetto dell'inferenza del tipo di Julia per un motivo diverso. Fondamentalmente, list comprehensions + map = qualche tipo di instabilità. Questo si propaga per rendere l'aritmetica più tardi lenta in quanto deve controllare i tipi. La correzione è semplicemente a = Vector{Int}[map(int, split(readline())) for _ = 1:n], che quindi mi dà real 0m0.474s.

La maggior parte del tempo viene quindi impiegata per l'avvio di Julia e la linea map e la stampa effettiva dello Case #. Se davvero espandi la linea map a cicli for, riesco a ridurla a real 0m0.411s ma non sembra valsa la pena.

+0

Grazie, questo mi ha portato a 'reale \t 0m1.116s'. Ma non vedo alcun guadagno dal mettere il codice in una funzione sulla mia macchina. – frost

+0

Inoltre, forse lo troverai utile, 'time cat A-large-practice.in | julia A.jl' è circa 0.15ms più lento di 'time julia A.jl frost