I have a harder time reading it the numpy way and benchmarks seem to
indicate that this list comprehension is faster:

```python

In [1]: from numpy import array, vstack, tile, roll

In [2]: def old():
   ...:     _codons = [a + b + c for a in "TCAG" for b in "TCAG" for c in "TCAG"]
   ...:     

In [3]: def newmpy():
   ...:     atgc = tile(array(['A', 'T', 'G', 'C']), 16)
   ...:     codons = [''.join(r) for r in vstack([atgc, roll(atgc, 1), roll(atgc, 2)]).T]
   ...:     

In [4]: %timeit newmpy()
1000 loops, best of 3: 186 µs per loop

In [5]: %timeit old()
10000 loops, best of 3: 15.1 µs per loop

```

On (May-10-14|17:30), Daniel McDonald wrote:
> > +    Examples
> > +    --------
> > +    >>> from skbio.core.genetic_code import GeneticCode
> > +    >>> sgc = GeneticCode('FFLLSSSSYY**CC*WLLLLPPPPHHQQRRRRIIIMTTTTNNKKSSR'
> > +    ...                   'RVVVVAAAADDEEGGGG')
> > +
> > +    .. note:: `*` is used to denote termination as per the NCBI standard.
> > +        Although the genetic code objecs convert DNA to RNA and vice versa,
> > +        lists of codons that they produce will be provided in DNA format.
> > +
> > +    """
> > +    # class data: need the bases, the list of codons in UUU -> GGG order, and
> > +    # a mapping from positions in the list back to codons. These should be the
> > +    # same for all GeneticCode instances, and are immutable (therefore
> > +    # private).
> > +    _codons = [a + b + c for a in "TCAG" for b in "TCAG" for c in "TCAG"]
> 
> Not sure if this is worth it, but because numpy is teh awesome:
> 
> ```python
> atgc = tile(array(['A', 'T', 'G', 'C']), 16)
> codons = [''.join(r) for r in vstack([atgc, roll(atgc, 1), roll(atgc, 2)]).T]
> ```
> 
> ---
> Reply to this email directly or view it on GitHub:
> https://github.com/biocore/scikit-bio/pull/310/files#r12506983