Nous savons tous que la façon la plus courante de l'exécution d'une instruction d'un certain nombre de fois en Python est d'utiliser un for
boucle.
La façon de le faire est,
# I am assuming iterated list is redundant.
# Just the number of execution matters.
for _ in range(count):
pass
Je crois que personne ne fera valoir que le code ci-dessus est la mise en commun, mais il est une autre option. À l'aide de la vitesse de la liste Python création en multipliant les références.
# Uncommon way.
for _ in [0] * count:
pass
Il y a aussi le vieux - while
moyen.
i = 0
while i < count:
i += 1
J'ai testé le temps d'exécution de ces approches. Voici le code.
import timeit
repeat = 10
total = 10
setup = """
count = 100000
"""
test1 = """
for _ in range(count):
pass
"""
test2 = """
for _ in [0] * count:
pass
"""
test3 = """
i = 0
while i < count:
i += 1
"""
print(min(timeit.Timer(test1, setup=setup).repeat(repeat, total)))
print(min(timeit.Timer(test2, setup=setup).repeat(repeat, total)))
print(min(timeit.Timer(test3, setup=setup).repeat(repeat, total)))
# Results
0.02238852552017738
0.011760978361696095
0.06971727824807639
Je ne voudrais pas lancer le sujet si il y avait une petite différence, mais il peut être vu que la différence de vitesse est de 100%. Pourquoi ne pas Python encourager une telle utilisation si la deuxième méthode est beaucoup plus efficace? Est-il un meilleur moyen?
Le test est fait avec Windows 10 et Python 3.6.
Suivant @Tim Peters suggestion,
.
.
.
test4 = """
for _ in itertools.repeat(None, count):
pass
"""
print(min(timeit.Timer(test1, setup=setup).repeat(repeat, total)))
print(min(timeit.Timer(test2, setup=setup).repeat(repeat, total)))
print(min(timeit.Timer(test3, setup=setup).repeat(repeat, total)))
print(min(timeit.Timer(test4, setup=setup).repeat(repeat, total)))
# Gives
0.02306803115612352
0.013021619340942758
0.06400113461638746
0.008105080015739174
Qui offre une bien meilleure façon, et ce joli beaucoup de réponses à ma question.
Pourquoi est-ce plus rapide que l' range
, puisque les deux sont des générateurs. Est-ce parce que la valeur ne change jamais?