Si consideri la seguente funzione:assegnazioni non necessari utilizzando gli operatori aggiornamento Julia
function mytest(x, b)
y = zeros(x[:,:,1])
for i in 1:length(b)
y += b[i] * x[:,:,i]
end
return y
end
quando l'eseguo, ricevo il seguente:
x = rand(30,30,100000)
b = rand(100000)
@time mytest(x,b)
elapsed time: 0.571765222 seconds (727837732 bytes allocated, 66.49% gc time)
Perché è allocare la memoria così tanto e spendere così tanto tempo fare la raccolta dei rifiuti? Il codice dovrebbe essere di tipo stabile e mi aspetto che l'operatore +=
non esegua alcuna ridistribuzione. Tuttavia, sembra che si stia ridistribuendo ogni volta che aggiunge due matrici.
Devo considerare che si tratta di un bug in Julia? E ancora più importante, come posso scrivere questo codice in un modo che non si riassegna?
MODIFICA: corretto errore di battitura.
Il lato destro 'b [i] * x [:,:, i]' prima assegna un array temporaneo con il risultato del prodotto prima che venga aggiunto sul posto a sinistra. L'array temporaneo deve quindi essere sottoposto a garbage collection. Almeno ... è così che funzionerebbe con [tag: numpy]. –
@moarningsun, grazie per il suggerimento. La mia precedente esperienza con il codice critico delle prestazioni è in gran parte uso di C++ ed Eigen, che non allocava un temporaneo quando si prendeva una fetta. Ho cambiato il mio codice per avere tre cicli annidati, e il problema di allocazione è stato risolto. (Prima ho provato a utilizzare il pacchetto ArrayViews, ma questo non sembrava risolvere le cose). Sono ancora curioso di sapere se c'è un modo migliore. –
@JimGarrison: controlla la discussione [qui] (https://groups.google.com/forum/#!topic/julia-users/i5hfGpWRHlk). '+ =' è solo zucchero sintattico (almeno per ora) e quindi penso che si riallacci sempre (ma qualcuno mi corregga se sbaglio). Inoltre, sarei interessato a vedere come i tre loop hanno risolto il tuo problema. – cd98