Python: arguments for using itertools to split a list into groups
<p>This is a question about the relative merits of fast code that uses the standard library but is obscure (at least to me) versus a hand-rolled alternative.  In this <a href="http://stackoverflow.com/questions/1825907/python-how-do-i-split-a-list-into-groups-closed">thread</a> (and others that it duplicates), it seems the "Pythonic" way to split a list into groups is to use itertools, as in the first function in the code example below (modified slightly from <a href="http://stackoverflow.com/users/6899/">ΤΖΩΤΖΙΟΥ</a>).</p>

<p>The reason I prefer the second function is that I can understand how it works, and if I don't need padding (turning a DNA sequence into codons, say), I can reproduce it from memory in an instant.</p>

<p>The speed is better with itertools.  Particularly if we don't want a list back, or we want to pad the last entry, itertools is faster.</p>

<p>What other arguments are there in favor of the standard library solution?</p>

<pre><code>from itertools import izip_longest

def groupby_itertools(iterable, n=3, padvalue='x'):
    "groupby_itertools('abcde', 3, 'x') --&gt; ('a','b','c'), ('d','e','x')"
    return izip_longest(*[iter(iterable)]*n, fillvalue=padvalue)

def groupby_my(L, n=3, pad=None):
    "groupby_my(list('abcde'), n=3, pad='x') --&gt; [['a','b','c'], ['d','e','x']]"
    R = xrange(0,len(L),n)
    rL = [L[i:i+n] for i in R]
    if pad:
        last = rL[-1]
        x = n - len(last)
        if isinstance(last,list):
            rL[-1].extend([pad] * x)
        elif isinstance(last,str):
            rL[-1] += pad * x
    return rL
</code></pre>

<p>timing:</p>

<pre><code>$ python -mtimeit -s 'from groups import groupby_my, groupby_itertools;  L = list("abcdefghijk")' 'groupby_my(L)'
100000 loops, best of 3: 2.39 usec per loop

$ python -mtimeit -s 'from groups import groupby_my, groupby_itertools;  L = list("abcdefghijk")' 'groupby_my(L[:-1],pad="x")'
100000 loops, best of 3: 4.67 usec per loop

$ python -mtimeit -s 'from groups import groupby_my, groupby_itertools;  L = list("abcdefghijk")' 'groupby_itertools(L)'
1000000 loops, best of 3: 1.46 usec per loop

$ python -mtimeit -s 'from groups import groupby_my, groupby_itertools;  L = list("abcdefghijk")' 'list(groupby_itertools(L))'
100000 loops, best of 3: 3.99 usec per loop
</code></pre>

<p>Edit:  I would change the function names here (see Alex's answer), but there are so many I decided to post this warning instead.</p>
