PyDay: praktische Module in der Standardbibliothek; Pakete selbst bauen

Marcel Martin

14. Dezember 2011

revcomp mit maketrans

Datei revcomp.py:

_TR = bytes.maketrans(b'ACGTacgt', b'TGCAtgca')

def reverse_complement(s):
    return s.translate(_TR)[::-1]

Ein “revcomp”-Modul

>>> import revcomp
>>> revcomp.reverse_complement("GGTACT")
'AGTACC'
>>> from revcomp import reverse_complement as rc
>>> rc("GGTACT")
'AGTACC'

Zeit messen mit timeit

http://docs.python.org/library/timeit.html

Zeitmessung von Python-Code an der Kommandozeile

$ python -m timeit "17*18"
10000000 loops, best of 3: 0.0264 usec per loop
$ python -m timeit "17**18"
10000000 loops, best of 3: 0.0245 usec per loop
$ python -m timeit "17**18**3"
10000 loops, best of 3: 148 usec per loop

timeit DNA

Mit “-s”: Setup-Code, der einmal vorher ausgeführt werden soll

python -m timeit \
    -s "from revcomp import reverse_complement as rc" \
    -s "s='GGTACT'*100" \
    "rc(s)"

Buchstaben-Häufigkeiten

Datei stats.py:

def character_frequencies1(s):
    """Return a dictionary of character frequencies"""
    freq = dict()
    for c in s:
        if c not in freq:
            freq[c] = 0
        freq[c] += 1
    return freq

Einfach zählen mit collections.Counter

from collections import Counter

def character_frequencies(s):
    """Return a dictionary of character frequencies"""
    c = Counter()
    c.update(s)
    return c

noch kürzer:

    return Counter(s)

Ausgabe:

>>> Counter("HELLO DEAR LADY")
Counter({'L': 3, 'A': 2, ' ': 2, 'E': 2, 'D': 2, 'H': 1, 'O': 1, 'R': 1, 'Y': 1})
>>> Counter("HELLO DEAR LADY").most_common(2)
[('L', 3), ('A', 2)]

Begriffe

http://docs.python.org/distutils/introduction.html#general-python-terminology

Ein Package

Unsere Package:

    dnastuff/
    ├── __init__.py    # <-- leer
    ├── revcomp.py
    └── stats.py

Package benutzen

>>> from dnastuff import revcomp
>>> revcomp.reverse_complement('TGGA')
'TCCA'

Woher kommt das dnastuff.revcomp-Modul?

>>> revcomp.__file__
'dnastuff/revcomp.py'

sys.path

Module und Packages werden in allen Pfaden, die in sys.path stehen, gefunden.

$ cd dnastuff
>>> import sys
>>> del sys.path[0]
>>> import revcomp
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named revcomp

Ziel: Sorge dafür, dass Package in einen der in sys.path stehenden Pfade installiert werden kann.

Eine Distribution

Nutze distutils, siehe http://docs.python.org/distutils/

Datei setup.py

from distutils.core import setup

setup(
    author = 'Rant MacMiler',
    name='dnastuff',
    version='0.1',
    packages=['dnastuff'],
)

Installation

$ python setup.py install

>>> import dnastuff
>>> import dnastuff.revcomp
>>> dnastuff.revcomp.reverse_complement('AAAGT')
'ACTTT'
>>> dnastuff.__file__
'/home/martin/.venv/pyday/lib/python3.2/site-packages/dnastuff/__init__.py'

andere Möglichkeiten