[Tutor] primes - sieve of odds

C Smith smichr at hotmail.com
Tue Mar 22 18:37:11 CET 2005


Hi Gregor,

I had done the same thing.  I also noted that assigning (or inserting) 
an element into a list is faster than creating a new list: 
l.insert(0,2) is faster than l = [2]+l.

###
def sieve (maximum):
      if maximum < 2: return []
      limit = int(maximum**0.5)
      nums = range(1,maximum+1,2)
      nums[0] = None
      for p in nums:
          if p:
              if p > limit: break
              nums[(p*p)//2::p] = [False]*(1+(maximum//p- p)//2)
      nums[0] = 2
      return filter(None, nums)
###
/c

> Hi Sean!
>
> Thanks for your measurements.
> In the meantime I did another amendment,
> leaving out the even numbers from the sieve.
> It goes like this:
>
> def sieve(maximum):
>      nums = range(3, maximum+1, 2)
>      for p in nums:
>          if p:
>              if p*p > maximum: break
>              start = (p*p-2)//2
>              nums[start::p] = [False]*(1+((maximum-3)//2-start)//p)
>      return [2] + filter(None, nums)
>
> Perhaps not very elegant. But approximately twice as fast as
> the former version.




More information about the Tutor mailing list