# Type Issues and Memory Mangement

**URL:** <https://discourse.julialang.org/t/type-issues-and-memory-mangement/10237>\
**Category:** General Usage\
**Created:** [April 8, 2018, 10:00pm UTC](https://discourse.julialang.org/t/type-issues-and-memory-mangement/10237 "2018-04-08T22:00:16Z")\
**Posts on this page:** 16\
**Page:** 1

<div class="post-metadata">

**Author:** ![gideonsimpson](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/gideonsimpson/32/1928_2.png) [@gideonsimpson](https://discourse.julialang.org/u/gideonsimpson)\
**Post date:** [April 8, 2018, 10:00pm UTC](https://discourse.julialang.org/t/type-issues-and-memory-mangement/10237/1 "2018-04-08T22:00:17Z")

</div>

For the following code:

```julia

function run0(x, V, n)
    for i=1:n
        V(x);
    end
end

function vA(x,A)
    v = 0.5 * A * x^2;
    return v
end

v1 = x-> vA(x,2);

x0 = rand();

@time run0(x0, v1, 10)
@time run0(x0, v1, 10)
@time run0(x0, v1, 100)
@time run0(x0, v1, 1000)
@time run0(x0, v1, 10000)

A = 2.0;
v2 = x-> vA(x,A);
@time run0(x0, v2, 10)
@time run0(x0, v2, 10)
@time run0(x0, v2, 100)
@time run0(x0, v2, 1000)
@time run0(x0, v2, 10000)

```

I find that the latter function, `v2`, is allocating additional memory at each iteration:

```julia
  0.005096 seconds (1.54 k allocations: 83.864 KiB)
  0.000003 seconds (4 allocations: 160 bytes)
  0.000002 seconds (4 allocations: 160 bytes)
  0.000002 seconds (4 allocations: 160 bytes)
  0.000001 seconds (4 allocations: 160 bytes)
  0.007968 seconds (1.65 k allocations: 88.158 KiB)
  0.000004 seconds (34 allocations: 640 bytes)
  0.000008 seconds (304 allocations: 4.844 KiB)
  0.000055 seconds (3.00 k allocations: 47.031 KiB)
  0.000514 seconds (30.00 k allocations: 468.906 KiB)

```

Looking at the `@code_warntype`, there are clearly type instabilities in the latter function:

```julia
julia> @code_warntype v2(x0)
Variables:
  #self# <optimized out>
  x::Float64
  v <optimized out>

Body:
  begin 
      SSAValue(0) = Main.A
      $(Expr(:inbounds, false))
      # meta: location /Users/gideonsimpson/code/weighted_ensemble/forpost3.jl vA 9
      # meta: location operators.jl * 424
      SSAValue(1) = ((0.5 * SSAValue(0))::Any * (Base.mul_float)(x::Float64, x::Float64)::Float64)::Any
      # meta: pop location
      # meta: pop location
      $(Expr(:inbounds, :pop))
      return SSAValue(1)
  end::Any

```

But I’m unclear on why these are occurring and how best to write code to avoid them.

---

<div class="post-metadata">

**Author:** ![PetrKryslUCSD](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/petrkryslucsd/32/215825_2.png) [@PetrKryslUCSD](https://discourse.julialang.org/u/PetrKryslUCSD)\
**Post date:** [April 8, 2018, 10:02pm UTC](https://discourse.julialang.org/t/type-issues-and-memory-mangement/10237/2 "2018-04-08T22:02:40Z")

</div>

`A` lives in `Main`: global scope → instability?

---

<div class="post-metadata">

**Author:** ![gideonsimpson](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/gideonsimpson/32/1928_2.png) [@gideonsimpson](https://discourse.julialang.org/u/gideonsimpson)\
**Post date:** [April 8, 2018, 10:06pm UTC](https://discourse.julialang.org/t/type-issues-and-memory-mangement/10237/3 "2018-04-08T22:06:02Z")

</div>

It’s certainly a global variable, but how does one handle this then? It often makes sense to write functions that have additional parameters, (`A` in this case) which will be set (globally) for the lifetime of the program. At least that’s the way I am used to writing code. Or is this merely something that one has to accept when working with Julia?

---

<div class="post-metadata">

**Author:** ![PetrKryslUCSD](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/petrkryslucsd/32/215825_2.png) [@PetrKryslUCSD](https://discourse.julialang.org/u/PetrKryslUCSD)\
**Post date:** [April 8, 2018, 10:06pm UTC](https://discourse.julialang.org/t/type-issues-and-memory-mangement/10237/4 "2018-04-08T22:06:47Z")

</div>

What if you put it inside a module?

---

<div class="post-metadata">

**Author:** ![cortner](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/cortner/32/204_2.png) [@cortner](https://discourse.julialang.org/u/cortner)\
**Post date:** [April 8, 2018, 10:20pm UTC](https://discourse.julialang.org/t/type-issues-and-memory-mangement/10237/5 "2018-04-08T22:20:49Z")

</div>

Let block or const?

---

<div class="post-metadata">

**Author:** ![ChrisRackauckas](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/chrisrackauckas/32/77_2.png) [@ChrisRackauckas](https://discourse.julialang.org/u/ChrisRackauckas)\
**Post date:** [April 8, 2018, 10:20pm UTC](https://discourse.julialang.org/t/type-issues-and-memory-mangement/10237/6 "2018-04-08T22:20:58Z")

</div>

> [@PetrKryslUCSD](#):
>
> What if you put it inside a module?

A module is still a dynamic scope, so that doesn’t help inference. Instead, just make `A` const, or declare the variable before usage in functions. Or `let` block like @cortner suggested.

---

<div class="post-metadata">

**Author:** ![gideonsimpson](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/gideonsimpson/32/1928_2.png) [@gideonsimpson](https://discourse.julialang.org/u/gideonsimpson)\
**Post date:** [April 8, 2018, 10:49pm UTC](https://discourse.julialang.org/t/type-issues-and-memory-mangement/10237/7 "2018-04-08T22:49:54Z")

</div>

Declaring

```julia
const A = 2.0;

```

works as suggested. Now how would I address the following variation:

```julia
const A = 2.0;
v2 = x-> vA(x,A);

function V2(x)
  return sum(v2,x)
end

X0 = rand(100);

@time run0(X0, V2, 10)
@time run0(X0, V2, 10)
@time run0(X0, V2, 100)
@time run0(X0, V2, 1000)
@time run0(X0, V2, 10000)

```

which returns:

```julia
  0.041488 seconds (22.00 k allocations: 1.192 MiB)
  0.000007 seconds (14 allocations: 320 bytes)
  0.000038 seconds (104 allocations: 1.719 KiB)
  0.000300 seconds (1.00 k allocations: 15.781 KiB)
  0.001827 seconds (10.00 k allocations: 156.406 KiB)

```

---

<div class="post-metadata">

**Author:** ![cortner](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/cortner/32/204_2.png) [@cortner](https://discourse.julialang.org/u/cortner)\
**Post date:** [April 9, 2018, 12:59am UTC](https://discourse.julialang.org/t/type-issues-and-memory-mangement/10237/8 "2018-04-09T00:59:24Z")

</div>

`const v2 = x-> vA(x,A);` but don’t ask me why?!?

---

<div class="post-metadata">

**Author:** ![jebej](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jebej/32/1784_2.png) [@jebej](https://discourse.julialang.org/u/jebej)\
**Post date:** [April 9, 2018, 1:47am UTC](https://discourse.julialang.org/t/type-issues-and-memory-mangement/10237/9 "2018-04-09T01:47:36Z")

</div>

> [@cortner](#):
>
> const v2 = x-\> vA(x,A); but don’t ask me why?!?

Exactly for the same reason as `A`: `v2` is a global variable and needs to be a constant to avoid boxing.

---

<div class="post-metadata">

**Author:** ![cortner](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/cortner/32/204_2.png) [@cortner](https://discourse.julialang.org/u/cortner)\
**Post date:** [April 9, 2018, 1:54am UTC](https://discourse.julialang.org/t/type-issues-and-memory-mangement/10237/10 "2018-04-09T01:54:21Z")

</div>

so there is a significant difference between `function v2(x)` and `v2 = x -> ` ?

---

<div class="post-metadata">

**Author:** ![cortner](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/cortner/32/204_2.png) [@cortner](https://discourse.julialang.org/u/cortner)\
**Post date:** [April 9, 2018, 1:55am UTC](https://discourse.julialang.org/t/type-issues-and-memory-mangement/10237/11 "2018-04-09T01:55:16Z")

</div>

I thought anonymous functions are automatically `const` because

```julia
julia> f = x -> x^2
(::#1) (generic function with 1 method)
julia> f(x) = x
ERROR: cannot define function f; it already has a value

```

---

<div class="post-metadata">

**Author:** ![mohamed82008](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mohamed82008/32/18171_2.png) [@mohamed82008](https://discourse.julialang.org/u/mohamed82008)\
**Post date:** [April 9, 2018, 2:01am UTC](https://discourse.julialang.org/t/type-issues-and-memory-mangement/10237/12 "2018-04-09T02:01:07Z")

</div>

```julia
julia> a = 1
1

julia> a(x) = 2
ERROR: cannot define function a; it already has a value

julia> const f = (x) -> (x^2)
(::#1) (generic function with 1 method)

julia> f(x,y) = x*y
(::#1) (generic function with 2 methods)

julia> f(2)
4

julia> f(2,3)
6

julia> g(x) = x^2
g (generic function with 1 method)

julia> g = 2
ERROR: invalid redefinition of constant g

```

So `function f(x) ....` or simply `f(x) = ...` make `f` constant by default.

---

<div class="post-metadata">

**Author:** ![cortner](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/cortner/32/204_2.png) [@cortner](https://discourse.julialang.org/u/cortner)\
**Post date:** [April 9, 2018, 2:07am UTC](https://discourse.julialang.org/t/type-issues-and-memory-mangement/10237/13 "2018-04-09T02:07:47Z")

</div>

Thank you, that helps.

---

<div class="post-metadata">

**Author:** ![jebej](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jebej/32/1784_2.png) [@jebej](https://discourse.julialang.org/u/jebej)\
**Post date:** [April 9, 2018, 2:15am UTC](https://discourse.julialang.org/t/type-issues-and-memory-mangement/10237/14 "2018-04-09T02:15:21Z")

</div>

```julia
julia> f = x->x^2+x
(::#7) (generic function with 1 method)

julia> f = 2.34
2.34

```

---

<div class="post-metadata">

**Author:** ![kristoffer.carlsson](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/kristoffer.carlsson/32/22_2.png) [@kristoffer.carlsson](https://discourse.julialang.org/u/kristoffer.carlsson)\
**Post date:** [April 9, 2018, 7:56am UTC](https://discourse.julialang.org/t/type-issues-and-memory-mangement/10237/15 "2018-04-09T07:56:58Z")

</div>

If you need a global variable where you need to be able to change its value, the typical way is to use a `const Ref` e.g.

```julia
const X = Ref(1)
getx() = X[]
setx(x) = X[] = x

```

---

<div class="post-metadata">

**Author:** ![gideonsimpson](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/gideonsimpson/32/1928_2.png) [@gideonsimpson](https://discourse.julialang.org/u/gideonsimpson)\
**Post date:** [April 10, 2018, 1:07am UTC](https://discourse.julialang.org/t/type-issues-and-memory-mangement/10237/16 "2018-04-10T01:07:08Z")

</div>

Thanks all. Is there any simpler alternative to declaring `const A=` or using the `Ref` construct?
