Я проходил генерацию простых чисел в python, используя сито Эратосфена и решения, которые люди рекламируют как относительно быстрый вариант, например, в нескольких из ответы на вопрос об оптимизации генерации простых чисел в python не являются простыми, и простая реализация, которую я здесь привожу, соперничает с ними в эффективности. Моя реализация приведена ниже
def sieve_for_primes_to(n):
size = n//2
sieve = [1]*size
limit = int(n**0.5)
for i in range(1,limit):
if sieve[i]:
val = 2*i+1
tmp = ((size-1) - i)//val
sieve[i+val::val] = [0]*tmp
return sieve
print [2] + [i*2+1 for i, v in enumerate(sieve_for_primes_to(10000000)) if v and i>0]
Время возврата выполнения
python -m timeit -n10 -s "import euler" "euler.sieve_for_primes_to(1000000)"
10 loops, best of 3: 19.5 msec per loop
Хотя метод, описанный в ответе на связанный выше вопрос как самый быстрый из кулинарной книги Python, приведен ниже.
import itertools
def erat2( ):
D = { }
yield 2
for q in itertools.islice(itertools.count(3), 0, None, 2):
p = D.pop(q, None)
if p is None:
D[q*q] = q
yield q
else:
x = p + q
while x in D or not (x&1):
x += p
D[x] = p
def get_primes_erat(n):
return list(itertools.takewhile(lambda p: p<n, erat2()))
При запуске дает
python -m timeit -n10 -s "import euler" "euler.get_primes_erat(1000000)"
10 loops, best of 3: 697 msec per loop
Мой вопрос: почему люди рекламируют вышеизложенное из кулинарной книги, которая относительно сложна, как идеальный первичный генератор?
erat2
как идеальный первичный генератор? Пожалуйста, предоставьте ссылки, чтобы мы могли лучше понять контекст, который вызвал ваш вопрос. - person NPE   schedule 15.04.2013rwh_primes2
? - person Martijn Pieters   schedule 15.04.2013erat2
сравнивали только с кодом OP на этой странице, и Алекс Мартелли только сказал, что решение Cookbook более чем в два раза быстрее по сравнению с решением OP. И ваше решение в два раза медленнее по сравнению сrwh_primes2
. - person Ashwini Chaudhary   schedule 15.04.2013rwh_primes1
. - person DSM   schedule 15.04.2013