1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
| #!/usr/bin/env python3
# coding: utf-8
import random
import timeit
from functools import partial
import re
# Initialisation random
random.seed()
def svear(sequence, motifs):
for i in range(len(sequence)):
for m in motifs:
if sequence[i:i + len(m)] == m:
return (i, m)
# for
# for
# svear()
def tyrtamos(sequence, motifs):
# liste des index des motifs trouvés dans sequence
inds = [sequence.find(motif) for motif in motifs]
# trouver le motif le plus proche du début de sequence
ind0, motif0 = max(inds), ''
for i in range(0, len(motifs)):
if inds[i] > -1 and inds[i] < ind0:
ind0, motif0 = inds[i], motifs[i]
return (ind0, motif0)
# tyrtamos()
def wiztricks(sequence, motifs):
res = re.search("(%s)" % "|".join(motifs), sequence)
return (res.span()[0], res.group())
# wiztricks()
def ypcman(sequence, motifs):
res = sorted(
[(m, sequence.find(m)) for m in motifs if sequence.find(m) != -1], key=lambda t: t[1]
)[0]
return (res[1], res[0])
# ypcman()
# Les fonctions à tester
fct = {
"svear": svear,
"tyrtamos": tyrtamos,
"wiztricks": wiztricks,
"ypcman": ypcman,
}
# Les données à traiter
sequence = 'TTATATATTATATATTTATGATGGGGTTAGATGGGATTGAAAATTATATATTATATATTTAT\
TGATGGGGTTAGATGGGATTGAAAATTATATATTATATATTTATGATGGGGTTTTATATATTATATATTTATGA\
TGGGGTTAGATGGGATTGAAAATTATATATTATATATTTATGATGGGGTTAGATGGGATTGAAAATTATATATT\
ATATATTTATGATGGGGTTTTATATATTATATATTTATGATGGGGTTAGATGGGATTGAAAATTATATATTATA\
ATTTATGATGGGGTTAGATGGGATTGAAAATTATATATTATATATTTATGATGGGGTTTTATATATTATATATT\
TATGATGGGGTTAGATGGGATTGAAAATTATATATTATATATTTATGATGGGGTTAGATGGGATTGAAAATTAT\
ATATTATATATTTATGATGGGGTTTTATATATTATATATTTATGATGGGGTTAGATGGGATTGAAAATTATATA\
TTATATATTTATGATGGGGTTAGATGGGATTGAAAATTATATATTATATATTTATGATGGGGTTTTATATATTA\
TATATTTATGATGGGGTTAGATGGGATTGAAAATTATATATTATATATTTATGATGGGGTTAGATGGGATTGAA\
AATTATATATTATATATTTATGATGGGGTTTTATATATTATATATTTATGATGGGGTTAGATGGGATTGAAAAT\
TATATATTATATATTTATGATGGGGTTAGATGGGATTGAAAATTATATATTATATATTTATGATGGGGTTTTAT\
ATATTATATATTTATGATGGGGTTAGATGGGATTGAAAATTATATATTATATATTTATGATGGGGTTAGATGGG\
ATTGAAAATTATATATTATATATTTATGATGGGGTTTTATATATTATATATTTATGATGGGGTTAGATGGGATT\
GAAAATTATATATTATATATTTATGATGGGGTTAGATGGGATTGAAAATTATATATTATATATTTATGATGGGG\
TTTTATATATTATATATTTATGATGGGGTTAGATGGGATTGAAAATTATATATTATATATTTATGATGGGGTTA\
GATGGGATTGAAAATTATATATTATATATTTATGATGGGGTTTTATATATTATATATTTATGATGGGGTTAGAT\
GGGATTGAAAATTATATATTATATATTTATGATGGGGTTAGATGGGATTGAAAATTATATATTATATATTTATG\
ATGGGGTTTTATATATTATATATTTATGATGGGGTTAGATGGGATTGAAAATTATATATTATATATTTATGATG\
GGGTTAGATGGGATTGAAAATTATATATTATATATTTATGATGGGGTTTTATATATTATATATTTATGATGGGG\
TTAGATGGGATTGAAAATTATATATTATATATTTATGATGGGGTTAGATGGGATTGAAAATTATATATTATATA\
TTTATGATGGGGTTTTATATATTATATATTTATGATGGGGTTAGATGGGATTGAAAATTATATATTATATATTT'
motifs = ['TAA', 'TAG', 'TGA','GAA','TTA','GTA','ATT','GTT']
# Vérifications fonctions donnent toutes un même résultat
assert (len(set(tuple(f(sequence, motifs)) for f in fct.values())) == 1)
print("Vérification fonctions ok")
# Le nombre de répétitions (les moyennes se feront sur cette valeur)
repeat = 20
# Appel des fonctions dans un ordre aléatoire et affichage du chrono
print("taille data=(%d, %d), repeat=%d" % (len(sequence), len(motifs), repeat))
for (k, v) in random.sample(tuple(fct.items()), len(fct)):
t = timeit.Timer(partial(v, sequence, motifs)).repeat(repeat=repeat, number=100000)
print("%s: min=%f, max=%f, avg=%f" % (k, min(t), max(t), sum(t) / len(t)))
# for |
Partager