2017-06-11 4 views
1

J'ai fait du code qui calcule des nombres premiers (Rien de spécial je sais) et comme prévu il ralentit le plus grand le nombre, je sais qu'il est impossible de faire la même vitesse peu importe le nombre mais je suis sûr que je pourrais améliorer sa vitesse, je ne sais pas comment ...Comment puis-je accélérer ce code python?

import time 
number = 1000000001 
count = 0 
start = time.time() 
while number > 1000000000 and number < 10000000000000: 
    for i in range(1, round(number/2 + 1)): 
     if (number/i).is_integer(): 
      count += 1 
     if count > 1: 
      break 
    if count < 2: 
     print(str(number) + ' prime') 
    number = number + 1 
    count = 0 
end = time.time() 
print(end - start) 
+5

Copie possible de [Le moyen le plus rapide de lister tous les nombres premiers sous N] (https://stackoverflow.com/questions/2068372/fastest-way-to-list-all-primes-below-n) – hallaksec

+3

Tout d'abord Python est lent. Deuxièmement, il existe de nombreux algorithmes très avancés et difficiles à comprendre pour trouver des nombres premiers. Ce n'est pas un sujet pour 5min talk. – freakish

+3

Utilisez un [tamis] (https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes) – khelwood

Répondre

4

Plusieurs choses:

  • vous n'avez pas à vérifier de 1, mais 3, 5 et tous impairs numéros;
  • vous n'avez pas à vérifier jusqu'à n/2, mais vous pouvez vous arrêter à sqrt (n);
  • n'utilisez pas la division, puisque vous travaillez avec des points flottants, mais utilisez % pour vérifier modulo;
  • vous devez seulement vérifier les nombres impairs (ou deux); et
  • vous pouvez omettre le plus grand que vérifier dans la boucle while, puisque le nombre ne s'incrémente que.

Ainsi, une version améliorée serait:

import time 
from math import sqrt # import square root 

start = time.time() 

for number in range(1000000001,10000000000000,2): # use for, hops of 2 
    for i in range(3, int(sqrt(number))+1,2): # check 3, 5,... up to sqrt(n) 
     if number % i == 0: # use modulo checks instead of floating point 
      break 
    else: # use a for-else structure for faster ending 
     print(str(number) + ' prime') 
    count = 0 
end = time.time() 
print(end - start)

Néanmoins, Python n'a pas été conçu pour tirer le meilleur parti d'une unité centrale de traitement. Si vous voulez vraiment coder un algorithme suroptimisé, vous devrez choisir un langage de programmation plus rapide (et moins pratique).

+1

Vous pouvez utiliser 'for n dans la plage (nombre, 10000000000000, 2)'. La boucle 'for' est plus rapide que la boucle' while'. – FJSevilla

+1

c'est très utile, j'ai aussi remarqué si je n'imprime pas les nombres premiers et à la place les ajoute à une liste et imprime la liste quand c'est fini c'est beaucoup plus rapide. – Qwertykey