import timeit NUM = 1000000 def generate_primes(n): nums = [i for i in xrange(n)] for i in xrange(2, n): if nums[i]: yield nums[i] for j in range(i*i, n, i): nums[j] = False def gen_primes(n): primes = [True] * n primes[0] = primes[1] = False for (i, isprime) in enumerate(primes): if isprime: yield i for j in range(i*i, n, i): primes[j] = False if __name__ == "__main__": # print timeit.timeit("list(gen_primes(NUM))", # setup = "from __main__ import gen_primes, NUM", number=1) # print timeit.timeit("list(generate_primes(NUM))", # setup = "from __main__ import generate_primes, NUM", number=1)
generate_primes is what I came up with. It is slower, and because Windows, I cannot find out why, yet. (Might be because xrange(n) is slower than enumerate(n) and / or [True] * n is faster than xrange(n))
The timeit print statements must be run one at a time, running both gives different results than if they are run individually.
Finding all primes less than a million takes ~0.4s on my machine (i5-661, 8 gigs of RAM)
No comments:
Post a Comment