Computing variance of variables is very slow in JuMP

The call to Statistics.var creates a dense quadratic matrix, so with n = 1_000 there are 500,500 terms in your objective function.

Do instead:

julia> using JuMP, Statistics

julia> function main(n)
           model = Model()
           @variable(model, x[1:n], Bin)
           @objective(model, Min, var(x .* rand(n)))
           return model
       end
main (generic function with 1 method)

julia> function my_main(n)
           model = Model()
           @variable(model, x[1:n], Bin)
           @variable(model, μ)
           @expression(model, y, x .* rand(n))
           @constraint(model, μ == sum(y) / n)
           @objective(model, Min, sum((yi - μ)^2 for yi in y))
           return model
       end
my_main (generic function with 1 method)

julia> @time main(200);
  1.320286 seconds (16.76 k allocations: 598.565 MiB, 4.88% gc time)

julia> @time my_main(200);
  0.000551 seconds (7.21 k allocations: 765.625 KiB)
1 Like