| Even more interesting to me: In [3]: ar = [1, 2, 3, 2, 4, 6, 3, 5 ,7, 3, 5, 8] In [4]: %timeit zip([iter(ar)]3)
100000 loops, best of 3: 2.02 us per loop In [5]: %timeit zip(ar[0::3], ar[1::3], ar[2::3])
1000000 loops, best of 3: 1.37 us per loop In [6]: %timeit zip((iter(ar),)3)
1000000 loops, best of 3: 1.34 us per loop From which I conclude:
- zipping slices is even more efficient, and arguably easier to grok
- but you get about the same runtime by multiplying a singleton tuple rather than a list However if you want to generalize the chunk size, multiplication seems to win out over slicing (with tuples still being more efficient than lists): In [7]: chunk1 = lambda n, it: zip([iter(it)]n) In [8]: chunk2 = lambda n, it: zip((iter(it),)n) In [9]: chunk3 = lambda n, seq: zip(*(seq[i::n] for i in xrange(n))) In [10]: %timeit chunk1(3, ar)
100000 loops, best of 3: 2.32 us per loop In [11]: %timeit chunk2(3, ar)
1000000 loops, best of 3: 1.83 us per loop In [12]: %timeit chunk3(3, ar)
100000 loops, best of 3: 3.55 us per loop |