Sometimes when I have a collection, I would like to be able to iterate over all but a few elements. It seems like the best way to do this in a functional style is to filter the original iterator. Looking at the code in base/iterator.jl, it appears that this should be efficient. However, this doesn't seem to be the case in the test I tried:
function f() v = [1:1000] s = 0 for x in v x == 499 && continue s += x end return s end function g() v = [1:1000] s = 0 for x in Filter(x -> x != 499, v) s += x end return s end function h() v = [1:1000] s = 0 for x in filter(x -> x != 499, v) s += x end return s end println(f()) println(g()) println(h()) @time for i in 1:10000; f(); end; @time for i in 1:10000; g(); end; @time for i in 1:10000; h(); end; Function f() is what I would have to do "by hand,", function g() is using a filtered iterator, and function h() is filtering the array itself. Here are the results I got: 500001 500001 500001 elapsed time: 0.074505435 seconds (80640000 bytes allocated) elapsed time: 0.422853779 seconds (159120000 bytes allocated) elapsed time: 0.533385388 seconds (330880000 bytes allocated) Why does this happen? Where are all the extra bytes being allocated in g()?