Je réfléchis à la meilleure façon d'écrire une fonction où le nombre d'éléments dans chaque tuple peut être défini.
par exemple si c'était
func("bonjour", n=3)
le résultat serait:
('b', 'o', 'n')
('o', 'n', 'j')
('n', 'j', 'o')
Je débute avec l'utilisation de timeit, donc n'hésitez pas à me corriger s'il y a quelque chose de faux ici :
import timeit
def n1(iterable, n=1):
#now_nxt_deque
from collections import deque
deq = deque(maxlen=n)
for i in iterable:
deq.append(i)
if len(deq) == n:
yield tuple(deq)
def n2(sequence, n=2):
# now_next
from itertools import tee
iterators = tee(iter(sequence), n)
for i, iterator in enumerate(iterators):
for j in range(i):
iterator.__next__()
return zip(*iterators)
def n3(gen, n=2):
from itertools import tee, islice
gens = tee(gen, n)
gens = list(gens)
for i, gen in enumerate(gens):
gens[i] = islice(gens[i], i, None)
return zip(*gens)
def prin(func):
for x in func:
yield x
string = "Lorem ipsum tellivizzle for sure ghetto, consectetuer adipiscing elit."
print("func 1: %f" %timeit.Timer("prin(n1(string, 5))", "from __main__ import n1, string, prin").timeit(100000))
print("func 2: %f" %timeit.Timer("prin(n2(string, 5))", "from __main__ import n2, string, prin").timeit(100000))
print("func 3: %f" %timeit.Timer("prin(n3(string, 5))", "from __main__ import n3, string, prin").timeit(100000))
résultats:
$ py time_this_function.py
func 1: 0.163129
func 2: 2.383288
func 3: 1.908363