Turns out that islice doesn't raise an IterationError, it just returns an empty list.
Fixing the problems, it runs in 237 μsec per loop, around 23 times more than the zip version.
while True: result = list(islice(iterator, 3)) if not result: break yield result
n = iter(array).next [(n(), n(), n()) for _ in xrange(len(array) / 3)]
Turns out that islice doesn't raise an IterationError, it just returns an empty list.
Fixing the problems, it runs in 237 μsec per loop, around 23 times more than the zip version.