Primzahlen - zum widerholten mal
Verfasst: Mittwoch 2. März 2005, 21:00
Hallo!
Auf mehrfachen Request jetzt nochmal ein Primzahlen Benchmark.
Ich werde das Ding noch umbauen wenn ich Zeit finde, dass es optparse, timeit und Generatoren nutzt.
Für Optimierungsvorschläge bin ich offen.
Auf mehrfachen Request jetzt nochmal ein Primzahlen Benchmark.
Code: Alles auswählen
#!/usr/bin/env python
# -*- encoding: latin-1 -*-
import sys, time
__version__ = "0.1.0"
args = """bench.py (%s) - Small benchmark with primes (Free Software - GPLed)
Commandline arguments:
bench.py [-n<number>|-t<number>|-u<number>|-i<number>] [-b|--benchmark]
-n<number> : get next prime which is bigger than <number>
-t<number> : find <number> primes
-u<number> : find primes until <number>
-i<number> : check whether <number> is a prime
-b --benchmark : benchmark results"""
def checkPrime(number):
"""This is the core def, it checks whether
the number is a prime or not."""
prime_found = False
# Some hacks, to return right values
if number == 0:
return False
if number == 2:
return True
if number < 0:
# If number is smaller than zero so use absolute value
number = abs(number)
for dividor in xrange(2, number):
if number % dividor is 0:
#print "No Prime: %d" % lastprime
prime_found = False
return False
else:
prime_found = True
if prime_found is True:
#print "Prime: %d" % lastprime
return True
def nextPrime(prime_to_test):
"""Returns the next prime"""
while True:
prime_to_test = prime_to_test + 1
#print "ptt==%d" % prime_to_test
if checkPrime(prime_to_test):
# Found prime
#print "Prime==%d" % prime_to_test
return prime_to_test
#break
def findNumberOfPrimes(primes_to_find):
"""Returns a list of primes
You have to wait long time without output
cause it produces no output to stdout
ToDo: make a starting value"""
primes_found = 0
lastnumber = 2
primes_list = []
while True:
if checkPrime(lastnumber):
primes_list.append(lastnumber)
primes_found = primes_found + 1
if primes_found == primes_to_find:
return primes_list
lastnumber = lastnumber + 1
def findPrimesUntil(until_number):
"""Finds primes until number N is reached"""
primes_list = []
for number in xrange(2, until_number):
if checkPrime(number):
primes_list.append(number)
return primes_list
def main():
"""The main def, which makes this script executable
PyLint: this def has to many branches, but what to do?"""
benchmark = False
if len(sys.argv) == 1:
# if no arguments display help
print args % __version__
# and exit
sys.exit(1)
elif len(sys.argv) == 3:
# benchmarking on?
if sys.argv[2][:2] == "-b" or sys.argv[2][:11] == "--benchmark":
print "Benchmark enabled"
benchmark = True
else:
print "There is no such commandline argument!"
if sys.argv[1][:2] == "-n":
# Simply get the next prime
if benchmark:
print "There is too less to benchmark"
prime_to_test = int(sys.argv[1][2:])
prime_found = nextPrime(prime_to_test)
print "Prime==%d" % prime_found
elif sys.argv[1][:2] == "-t":
until_prime = int(sys.argv[1][2:])
if benchmark:
startTime = time.time()
primes = findNumberOfPrimes(until_prime)
if benchmark:
stopTime = time.time()
taken = stopTime - startTime
for prime in primes:
print "Prime==%d" % prime
if benchmark:
print "Seconds==%G" % taken
elif sys.argv[1][:2] == "-u":
until_number = int(sys.argv[1][2:])
if benchmark:
startTime = time.time()
primes = findPrimesUntil(until_number)
if benchmark:
stopTime = time.time()
taken = stopTime - startTime
for prime in primes:
print "Prime==%d" % prime
if benchmark:
print "Seconds==%G" % taken
elif sys.argv[1][:2] == "-i":
prime_to_check = int(sys.argv[1][2:])
if benchmark:
print "There is too less to benchmark"
result = checkPrime(prime_to_check)
if result == True:
print "Prime==True"
else:
print "Prime==False"
def longxrange(start,stop=None,step=1):
"""myxrange([start=0],stop,[step=1]) --> iterator object like xrange for longs
coded by Milan:
http://python.sandtner.org/viewtopic.php?t=1366"""
if stop == None:
stop = start
start = 0
if step > 0:
while start < stop:
yield start
start += step
elif step < 0:
while start > stop:
yield start
start += step
else:
raise ValueError, "step must be != 0"
if __name__ == '__main__':
main()
Für Optimierungsvorschläge bin ich offen.