Skip to content

Instantly share code, notes, and snippets.

@pschwede
Created October 12, 2012 13:26
Show Gist options
  • Save pschwede/3879194 to your computer and use it in GitHub Desktop.
Save pschwede/3879194 to your computer and use it in GitHub Desktop.
Adds primes into a file that lists primes. (Absurdly fast single-thread prime finder.)
#!/usr/bin/env python
import time
import os.path
import atexit
import argparse
def write_primes(filename, known_primes):
"""Writes all known primes from RAM to disk"""
f = open(filename, "w")
write = lambda p: f.write("%i\n" % p)
[write(p) for p in sorted(list(set(known_primes)))]
f.close()
def read_primes(filename):
"""Loads all saved numbers into RAM"""
if os.path.exists(filename):
f = open(filename, "r")
primes = [int(l) for l in f.readlines()]
f.close()
if len(primes) > 3:
return primes
return [2, 3, 5]
def check_prime(n, known_primes):
"""Lazily checks whether n is prime using known primes"""
for p in known_primes:
if p * p >= n:
return True
if n % p == 0:
return False
return True
def find_primes(known_primes, limit=500000):
n = known_primes[-1]
kp_app = known_primes.append
while n < args.top:
n += 2
if check_prime(n, known_primes):
kp_app(n)
if __name__ == "__main__":
app = argparse.ArgumentParser(description="Prime number finder")
app.add_argument("listfile", default="list.txt", type=str,
help="give it some primes")
app.add_argument("--top", "-t", default=500000, type=long,
help="greates number to check for being prime")
args = app.parse_args()
known_primes = read_primes(args.listfile)
atexit.register(write_primes, args.listfile, known_primes)
t = time.time()
find_primes(known_primes, args.top)
print "It took %.2fs for %i prime numbers." % (time.time() - t, len(known_primes))
@pschwede
Copy link
Author

Calculates all prime numbers from 1 to 500000 in 1.67 seconds on a single 1.67 GHz core.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment