Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

A Fast Prime Number Sieve in Python

I have been going through prime number generation in python using the sieve of Eratosthenes and the solutions which people tout as a relatively fast option such as those in a few of the answers to a question on optimising prime number generation in python are not straightforward and the simple implementation which I have here rivals them in efficiency. My implementation is given below

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]

Timing the execution returns

python -m timeit -n10 -s "import euler" "euler.sieve_for_primes_to(1000000)"
10 loops, best of 3: 19.5 msec per loop

While the method described in the answer to the above linked question as being the fastest from the python cookbook is given below

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()))

When run it gives

python -m timeit -n10 -s "import euler" "euler.get_primes_erat(1000000)"
10 loops, best of 3: 697 msec per loop

My question is why do people tout the above from the cook book which is relatively complex as the ideal prime generator?

like image 701
cobie Avatar asked Apr 14 '13 21:04

cobie


People also ask

What is the fastest prime sieve in Python?

pyprimesieve is number 1! Many primes, very fast. Uses primesieve. primesieve, one of the fastest (if not the fastest) prime sieve implementaions available, is actively maintained by Kim Walisch. It uses a segmented sieve of Eratosthenes with wheel factorization for a complexity of O (nloglogn) operations.

What is sieve of Eratosthenes in Python?

Write a Python program using Sieve of Eratosthenes method for computing primes upto a specified number. Note: In mathematics, the sieve of Eratosthenes (Ancient Greek: κόσκινον Ἐρατοσθένους, kóskinon Eratosthénous), one of a number of prime number sieves, is a simple, ancient algorithm for finding all prime numbers up to any given limit.

How much faster is pyprimesieve than NumPy?

It can be seen here that pyprimesieve is 4.7 times faster than the fastest Python alternative using Numpy and 13.85 times faster than the fastest pure Python sieve. All benchmark scripts and algorithms are available for reproduction. Prime sieve algorithm implementations were taken from this discussion on SO.

How to generate a prime number in Python?

The loop starts with 5, which is 6n – 1 and test n % ( i + 2 ) which is 6n + 1 To implement the Python prime number generator, we need to get the start and end range from the user and implement Sieve of Eratosthenes to generate all the possible prime numbers with the range.


1 Answers

I transformed your code to fit into the prime sieve comparison script of @unutbu at Fastest way to list all primes below N as follows:

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 [2] + [i*2+1 for i, v in enumerate(sieve) if v and i>0]

On my MBPro i7 the script is fast calculating all primes < 1000000 but actually 1.5 times slower than rwh_primes2, rwh_primes1 (1.2), rwh_primes (1.19) and primeSieveSeq (1.12) (@andreasbriese at the page end).

like image 123
ABri Avatar answered Oct 15 '22 07:10

ABri