On Wednesday, July 16, 2014 11:28:12 AM UTC-4, Dahua Lin wrote: > sumabs2(x) >
That's cheating! Neal, I think what you wrote will work just fine, and sumabs2 will work even better. It's a little tough to see what all is being done in its implementation because the base library is trying to eek every last ounce of performance out of the code, and do so generically for many operations. Some of the optimizations may include: 1. Using an explicit loop. Unlike other languages (Matlab/Python/R), Julia's for loops are faster than its vectorized alternatives. That's because it needs to allocate an entire copy of an array for every operation. Something like this will get you most of the way there: s = zero(T) # Use a real zero of the same type as the complex number so it doesn't change type for xi in x s += real(xi)*real(xi)+imag(xi)*imag(xi) end 2. But for arrays, we can do better. Iteratively summing like that has major floating point issues; if you're summing lots of small numbers, `s` slowly becomes so large that the rest of the small numbers get lost within the precision. The base implementation of sum for arrays is smarter — it sums things "pairwise." Instead of summing everything into one large pot, it sums things into small pots, then sums those together, and so on. This requires an array as not all iterables support random access. I think those two things will get you most of the way to being competitive with the base algorithm.