[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