Hier mal eine erste Version des Benchmarks:
Code: Alles auswählen
#!/usr/bin/env python2.4
# -*- coding: UTF-8 -*-
"""
Modul: xlrange_test
Description: Benchmark for xlrange
Version: 0.1
Copyright: 2004 by Milan & Dookie (Pythonforum)
Created: 15. Dez. 2004
Last modified: 16. Dez. 2004
License: free
Requirements: Python2.4
Exports: Classes and Functions to export
"""
def xlrange1(start,stop=None,step=1):
"""xlrange1([start=0,]stop[,step=1]) --> iterator object like xrange for longs"""
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, "xlrange() arg 3 (step) must not be zero"
def handleargs(arglist):
"""Take list of arguments and extract/create proper start, stop, and step
values and return in a tuple found in Demos/"""
try:
if len(arglist) == 1:
return 0, arglist[0], 1
elif len(arglist) == 2:
return arglist[0], arglist[1], 1
elif len(arglist) == 3:
if arglist[2] == 0:
raise ValueError("xlrange() step argument must not be zero")
return tuple([x for x in arglist])
else:
raise TypeError("xlrange() accepts 1-3 arguments, given", len(arglist))
except TypeError:
raise TypeError("xlrange() arguments must be numbers or strings "
"representing numbers")
def xlrange2(*a):
"""xlrange2([start=0,]stop[,step=1]) --> iterator object like xrange for longs"""
start, stop, step = tuple(long(x) for x in handleargs(a))
value = start
if step < 0:
while value > stop:
yield start
value += step
elif step > 0:
while value < stop:
yield start
value += step
def xlrange3(*a):
import sys
start, stop, step = tuple(long(x) for x in handleargs(a))
if step < 0:
if start - stop > sys.maxint:
return xlrange2(*a)
elif abs(start) > sys.maxint or abs(stop) > sys.maxint:
rstop = stop - start
return (start + x for x in xrange(0, rstop, step))
else:
if stop - start > sys.maxint:
return xlrange2(*a)
elif abs(start) > sys.maxint or abs(stop) > sys.maxint:
rstop = stop - start
return (start + x for x in xrange(0, rstop, step))
return xrange(*a)
if __name__ == "__main__":
from timeit import Timer
start = 10000000000
r = 100000
stop = start+r
try:
t = Timer("for i in xrange(%i, %i): pass" % (start, stop))
print "%7.3f xrange(%i, %i)" % (t.timeit(10000000/r), start, stop)
except OverflowError:
pass
t = Timer("for i in xlrange1(%i, %i): pass" % (start, stop),
"from __main__ import xlrange1")
print "%7.3f xlrange1(%i, %i)" % (t.timeit(10000000/r), start, stop)
t = Timer("for i in xlrange2(%i, %i): pass" % (start, stop),
"from __main__ import xlrange2")
print "%7.3f xlrange2(%i, %i)" % (t.timeit(10000000/r), start, stop)
t = Timer("for i in xlrange3(%i, %i): pass" % (start, stop),
"from __main__ import xlrange3")
print "%7.3f xlrange3(%i, %i)" % (t.timeit(10000000/r), start, stop)
xlrange1 ist die Ursprüngliche Verson von Milan, xlrange2 die für Longs optimierte Version von Dookie und xlrange3 basiert auf einer Idee von jens.
Gruß
Dookie