Comment accélérer mes calculs avec des boucles? Python
J'ai écrit ce code. Mais cela fonctionne très lentement.
Je suis en train de déterminer combien de fois je dois exécuter le générateur de cas pour trouver des nombres inférieurs ou égaux à inv, dans ce cas six. Je compte le nombre de tentatives jusqu'à ce qu'un chiffre <= 6 soit généré. Je trouve inv égal à 1 et répète la boucle. Jusqu'à ce que inv soit 0. Je continuerai d'essayer de générer six chiffres <= 6.
Et je vais répéter tout cela 10 ** 4 degrés à nouveau pour trouver la moyenne arithmétique.
Aidez-moi à accélérer ce code. Fonctionne extrêmement lentement. La solution doit être sans modules tiers. Je serais extrêmement reconnaissant. Remercier!
import random
inv = 6
def math_count(inv):
n = 10**4
counter = 0
while n != 0:
invers = inv
count = 0
while invers > 0:
count += 1
random_digit = random.randint(1, 45)
if random_digit <= invers:
invers -= 1
counter += count
count = 0
if invers == 0:
n -= 1
invers = inv
return print(counter/10**4)
math_count(inv)
Réponses
Le code est très difficile à suivre. Voici un refactor possible pour rendre son intention plus claire. Quelques idées clés dans la simplification: (1) utiliser des boucles pour gérer les compteurs plutôt que d'incrémenter / décrémenter manuellement; (2) utiliser des noms de variables plus significatifs lorsque le contexte n'est pas clair; et (3) déléguer une partie de la complexité à une fonction d'assistance. La troisième idée est la plus percutante: la fonction d'assistance est simple car elle fait si peu; et la fonction principale, déchargée d'un fardeau, est aussi plus simple - si simple, en fait, qu'elle se résume à calculer une somme sur deux boucles.
def math_count(inv, trials = 10000):
total_attempts = sum(
attempts_to_get_lte(x)
for _ in range(trials, 0, -1)
for x in range(inv, 0, -1)
)
return total_attempts / trials
def attempts_to_get_lte(x):
attempts = 0
while True:
attempts += 1
if random.randint(1, 45) <= x:
return attempts
Mais attempts_to_get_lte()c'est un problème de probabilité facilement résolu: plutôt que de laisser Python simuler le retournement manuel des pièces, nous pouvons simplement faire un peu de calcul. Si vous préférez cette approche, je pense que ce qui suit est correct (les experts en probabilités devraient intervenir si je me suis égaré):
def math_count_exact(inv):
return sum(45 / x for x in range(inv, 0, -1))