Napisałem Sito Eratostenesa - myślę - ale wygląda na to, że nie jest tak zoptymalizowane, jak mogłoby być. Działa, i dostaje wszystkie liczby pierwsze do N, ale nie tak szybko, jak miałem nadzieję. Wciąż się uczę Python - pochodzące z dwóch lat Jawa - więc jeśli coś nie jest szczególnie pythonowy potem przepraszać:Optymalizuj sito Eratostenesa Dalej
def sieve(self):
is_prime = [False, False, True, True] + [False, True] * ((self.lim - 4) // 2)
for i in range(3, self.lim, 2):
if i**2 > self.lim: break
if is_prime[i]:
for j in range(i * i, self.lim, i * 2):
is_prime[j] = False
return is_prime
Szukałem w innych pytań podobnych do tego ale nie mogę” t wymyślić, w jaki sposób niektóre bardziej skomplikowane optymalizacje będą pasowały do mojego kodu. Jakieś sugestie?
EDYCJA: zgodnie z życzeniem, niektóre z innych optymalizacji, jakie widziałem, zatrzymują iterację pierwszej pętli przed limitem i pomijam różne numery - co według mnie jest optymalizacją koła?
EDIT 2: Oto kod, który wykorzystuje metodę, za PADRAIC:
primes = sieve.sieve()
for i in range(0, len(primes)):
if primes[i]:
print("{:d} ".format(i), end = '')
print() # print a newline
Czy możesz podać krótki opis wyjaśniający te inne optymalizacje, do których się odwołujesz? – BlackVegetable
Druga linia 'if i ** 2> self.lim: break' jest zbędna. – jwodder
@BlackVegetable Pytanie edytowane. – hfehlan