Bonjour,
j’ai un code qui fonctionne plutôt bien pour résoudre un problème sur des nombres entier à chiffres croissants (ex 12557 mais pas 12657) , pour ce problème j’ai créé un générateur crois2
, comme je le ne trouvais pas très beau j’en ais fait une nouvelle version crois
qui me paraissait meilleure, et j’ai eu une surprise :
In [19]: %timeit for i in crois(5_000_000): pass
4.79 ms ± 6.71 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
In [20]: %timeit for i in crois2(5_000_000): pass
12.1 ms ± 122 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
In [17]: %timeit pb74(5_000_000, crois)
315 ms ± 810 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)
In [18]: %timeit pb74(5_000_000, crois2)
155 ms ± 127 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
Donc le générateur crois
est 2.5 fois plus rapide que crois2
, mais quand je les appelle dans ma fonction pb74
celle est 2 fois plus rapide avec crois2
qu’avec crois
, on voit bien que le temps passé par les générateurs est dans tous les cas très petit face à la fonction principale, mais le résultat me semble étrange, auriez une idée sur ce qui provoque cela ?
from math import factorial
fact = {n:factorial(n) for n in range(10)}
#Premier générateur en 2 fonctions utilisant des listes
def nxc(lst):
lst.append(0)
lst[0] += 1
i = 0
while lst[i] == 10:
i += 1
lst[i] += 1
if i != len(lst)-1: lst.pop()
v = lst[i]
for j in range(i): lst[j] = v
return lst
def crois2(n):
val, num = [0],0
while num < n:
val = nxc(val)
num = int(''.join(map(str, val)))
yield num
#2eme générateur n'utlisant que des entiers.
def crois(lim,start=0):
n, i = start, 0
while n < lim:
yield n
n = n +1
r = n%10
while r==0: (n, r), i = divmod(n, 10), i + 1
while i: n, i = n * 10 + r, i - 1
#Fonctions principales
def chaine(n):
def suiv(i):
s = 0
while i:
i, r = divmod(i,10)
s += fact[r]
return s
val, ch = suiv(n), {n}
while val not in ch:
ch.add(val)
val = suiv(val)
return len(ch)
def pb74(n=200, gen=crois):
lval, lch = 0 ,0
for i in gen(n):
ls = chaine(i)
if ls > lch:
#print(i, ls)
lval, lch = i, ls
return lval, lch
+0
-0