Avertissement : Optimisations prématurées à venir...
Puisque tant de réponses ici font le timing de ceci, je voulais ajouter une autre alternative.
Prenant @Martin Geisler's
def roundup(x):
return x if x % 100 == 0 else x + 100 - x % 100
(que je préfère pour plusieurs raisons)
mais en tenant compte du % d'action
def roundup2(x):
x100= x % 100
return x if x100 == 0 else x + 100 - x100
Amélioration de la vitesse d'environ 20 % par rapport à l'original.
def roundup3(x):
x100 = x % 100
return x if not x100 else x + 100 - x100
est encore meilleur et est ~36% plus rapide que l'original.
Finalement, je pensais que je pourrais laisser tomber le not
et de changer l'ordre des branches en espérant que cela augmenterait également la vitesse, mais j'ai été déconcerté de découvrir qu'il est en fait plus lent et qu'il n'est plus que 23 % plus rapide que l'original.
def roundup4(x):
x100 = x % 100
return x + 100 - x100 if x100 else x
>python -m timeit -s "x = 130" "x if x % 100 == 0 else x + 100 - x % 100"
1000000 loops, best of 3: 0.359 usec per loop
>python -m timeit -s "x = 130" "x100 = x % 100" "x if x100 == 0 else x + 100 - x100"
1000000 loops, best of 3: 0.287 usec per loop
>python -m timeit -s "x = 130" "x100 = x % 100" "x if not x100 else x + 100 - x100"
1000000 loops, best of 3: 0.23 usec per loop
>python -m timeit -s "x = 130" "x100 = x % 100" "x + 100 - x100 if x100 else x"
1000000 loops, best of 3: 0.277 usec per loop
Des explications sur la raison pour laquelle le 3 est plus rapide que le 4 seraient les bienvenues.
3 votes
Voulez-vous que 100 soit également arrondi à 200 ?
0 votes
Non, la réponse de Thomas fait exactement ce dont j'ai besoin.
1 votes
La réponse de Thomas fait arrondir 100 à 200. C'est pourquoi j'ai demandé.
0 votes
Vérifiez l'édition, je n'ai pas fait attention à cela dans la première réponse.
2 votes
@ofko : Vous avez accepté une réponse qui échoue avec les grands entiers ; voir ma réponse mise à jour pour les détails.