Le jeudi 21 avril 2016 à 13:24 -0700, Andrew a écrit : > I don't get it, but it doesn't like something about concatenating the > number and the array. If you convert the 1 to an array first, it > works. I thought it was because 1 is an integer and you're joining it > with an array of float 0's, but using 1. doesn't work either. > > function version1(N) > b = [[1]; zeros(N-1)] > println(typeof(b)) > for k = 1:N > for j = 1:N > b[j] += k > end > end > end > > This has no type issues. This looks like https://github.com/JuliaLang/julia/issues/13665
Regards > > Thanks. I figured it was something along these lines. I'd forgotten > > about the "@code_warntype" macro > > > > > It looks like the type inference is failing in version1. If you > > > do "@code_warntype version1(1000)", it shows that it is inferring > > > the type of b as Any. > > > > > > > In a class I'm teaching the students are using Julia and I > > > > couldn't for the life of me figure out why one of my students > > > > codes was allocating a lot of memory. > > > > > > > > I finally paired it down the following example that I don't > > > > understand: > > > > > > > > function version1(N) > > > > b = [1;zeros(N-1)] > > > > println(typeof(b)) > > > > for k = 1:N > > > > for j = 1:N > > > > b[j] += k > > > > end > > > > end > > > > end > > > > > > > > > > > > function version2(N) > > > > b = zeros(N) > > > > b[1] = 1 > > > > println(typeof(b)) > > > > for k = 1:N > > > > for j = 1:N > > > > b[j] += k > > > > end > > > > end > > > > end > > > > > > > > N = 1000 > > > > println("compiling..") > > > > @time version1(N) > > > > version2(N) > > > > println() > > > > println() > > > > > > > > println("Version 1") > > > > @time version1(N) > > > > println() > > > > > > > > println("Version 2") > > > > @time version2(N) > > > > > > > > The output of this (without the compiling output) in v0.4.5 is: > > > > > > > > Version 1 > > > > Array{Float64,1} > > > > 0.092473 seconds (3.47 M allocations: 52.920 MB, 3.24% gc > > > > time) > > > > > > > > Version 2 > > > > Array{Float64,1} > > > > 0.001195 seconds (27 allocations: 8.828 KB) > > > > > > > > Both version produce the same type for Array b, but in version1 > > > > every time through the loop allocation happens and in the > > > > version2 the only allocation is of the initial array. > > > > > > > > I've not run into this one before (because I would never do > > > > version1), but as all of us that teach know students will > > > > always surprise you with their approaches. > > > > > > > > Any help understanding what's going on would be appreciated. > > > >