Created
October 12, 2012 13:26
-
-
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.)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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)) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Calculates all prime numbers from 1 to 500000 in 1.67 seconds on a single 1.67 GHz core.