I tried it on 0.4 and there the speed of zip seems fine.

On Thursday, March 31, 2016 at 1:51:45 PM UTC+2, Tim Holy wrote:
>
> Try zip. If you see a performance hit there too, it would be worth 
> reporting 
> (as long as you're testing julia-0.5). 
>
> --Tim 
>
> On Thursday, March 31, 2016 01:44:17 AM jw3126 wrote: 
> > Is it possible to chain iterators in julia efficiently? By chaining I 
> mean 
> > the following. I have a tuple of iterators and I would like to have a 
> > function "chain" such that 
> > 
> > for itr in iters, i in itr 
> >     ... 
> > end 
> > 
> > is equivalent to 
> > 
> > for i in chain(iters) 
> >    ... 
> > end 
> > 
> > I found such a function in the Iterators package, however it is not type 
> > stable and hence dog slow. So I tried to cook up a fast version as 
> follows: 
> > 
> > immutable FastChain{n,T} 
> >     xss::NTuple{n, T} 
> > end 
> > 
> > import Base.start 
> > import Base.next 
> > import Base.done 
> > 
> > start(it::FastChain) = 1, start(it.xss[1]) 
> > 
> > function next{n, T}(it::FastChain{n,T}, state) 
> >     i, xs_state = state 
> >     v, xs_state = next(it.xss[i], xs_state) 
> > 
> >     if done(it.xss[i], xs_state) 
> >         i += 1 
> >         if i <= n 
> >             xs_state = start(it.xss[i]) 
> >         end 
> >     end 
> >     return v, (i, xs_state) 
> > end 
> > 
> > done{n,T}(it::FastChain{n,T}, state) = state[1] > n 
> > 
> > While this is indeed type stable and faster then Iterators.chain, it is 
> > still much slower then the manual version: 
> > 
> > function perf_chain(ch) 
> >     res = 0 
> >     for i in ch 
> >         res += 1 
> >     end 
> >     res 
> > end 
> > 
> > function perf_manual(iters) 
> >     res = 0 
> >     for itr in iters, i in itr 
> >         res += 1 
> >     end 
> >     res 
> > end 
> > 
> > importall Base.Cartesian 
> > typealias Ci CartesianIndex 
> > typealias Cr CartesianRange 
> > 
> > # create some iterators e.g. cartesian ranges with 2_000_000 elements 
> > iter1 = Cr(Ci((2, 3)), Ci((1000, 2000))) 
> > iter2 = Cr(Ci((2, 3)), Ci((2000, 1000))) 
> > iters = (iter1, iter2) 
> > ch = FastChain(iters) 
> > 
> > @assert perf_chain(ch) == perf_manual(iters) 
> > 
> > @time perf_chain(ch)  # 0.035134 seconds (5 allocations: 176 bytes) 
> > @time perf_manual(iters)  # 0.002136 seconds (5 allocations: 176 bytes) 
> > 
> > I do not understand where this huge performance gap comes from? Any 
> ideas 
> > for speedup? 
> > 
> > Also I would love to chain iterators which yield the same type of 
> elements, 
> > but have different state type. Is there a way to achieve this 
> efficiently? 
> > What worries me is that I don't see how to make the `next` function type 
> > stable in this case. 
>
>

Reply via email to