Seite 1 von 2

Verfasst: Donnerstag 16. Dezember 2004, 18:19
von Milan
Hi. Schöne Sache, aber was ist mit xlrange3(-sys.maxint-2,sys.maxint+1,10000) ?

Verfasst: Donnerstag 16. Dezember 2004, 19:20
von Dookie
Wie gesagt, erste Version und xrange3 hab ich nur auf die schnelle hingeschrieben :)


Dookie

Verfasst: Donnerstag 16. Dezember 2004, 19:36
von Milan
Ich bin noch auf der Suche nach nen paar Formeln um meine Idee zu verwirklichen... aber mich stoßen jetzt schon die vielen if's ab, die ich bis jetzt habe... ich glaube, das schreib ich einandermal weiter, bis dahin kommt man vielleicht ja auch auf andere Ideen (reicht ja trotzdem erstmal die vorläufige Version von xlrange).

mfG Milan

Verfasst: Donnerstag 16. Dezember 2004, 19:59
von Leonidas
Es braucht aber mindestens Python 2.4, nicht wie geschrieben 2.3. So, mal testen.. dummerweise ist die Kiste mit Python 2.4 so lahm, ich werd wohl mal die Wiederholungen runtersetzen.

Verfasst: Donnerstag 16. Dezember 2004, 20:11
von Dookie
stimmt, den Header macht mein VIM halbautomatisch und da ich noch vorzugsweise für Python2.3 code steht das noch drinn - habs geändert :)

Gruß

Dookie

Verfasst: Donnerstag 16. Dezember 2004, 20:24
von Leonidas
Na dann poste ich mal meine Ergebnisse:

Code: Alles auswählen

leonidas@sparc:~/py24$ python2.4 xlbench.py
427.290 xlrange1(10000000000, 10000100000)
387.847 xlrange2(10000000000, 10000100000)
343.588 xlrange3(10000000000, 10000100000)
Wunderbar, ich werde noch die Python 2.4 class-Variante testen, aber warum ist denn die so anders als die ursprüngliche Python 2.3 def-Variante? Eleganter?

Ich habe sie jetzt auch so modifiziert, dass man sie zum testen nutzen kann:

Code: Alles auswählen

class xlrange24:
    """xlrange24([start=0,]stop[,step=1]) --> iterator object like xrange for longs"""
    def __init__(self, *a):
        self.start, self.stop, self.step = tuple(long(x) for x in handleargs(a))
        if self.step > 0:
            self.is_next = lambda: self.start < self.stop
        elif self.step < 0:
            self.is_next = lambda: self.start > self.stop
    def __iter__(self):
        return self
    def next(self):
        if self.is_next():
            i = self.start
            self.start += self.step
            return i
        else:
            raise StopIteration
Edit (ich ;) ): Code hinzugefügt
Edit: (ich nochmal): Beim testen unnötigen Code gekickt.

Verfasst: Donnerstag 16. Dezember 2004, 20:56
von Milan
Leonidas hat geschrieben:Wunderbar, ich werde noch die Python 2.4 class-Variante testen, aber warum ist denn die so anders als die ursprüngliche Python 2.3 def-Variante? Eleganter?
Wohl kaum... ich finds scheußlich, aber in 2.2 gabs noch keine Generatorfunktionen. Dookie hat das ganze einfach auf 2.4 getestet, nehm ich an :wink: ...

Verfasst: Donnerstag 16. Dezember 2004, 21:14
von Leonidas
Ach so.. ich finds auch nicht direkt eleganter, da länger als eine Funktion. Ich habe mal den Benchmark auf 110 MHz verträgliche Werte gesetzt - und den starter etwas umgebaut.. ist praktischer für's testen wenn man es mit -s 10 -i 1000 startet, so sieht man schneller wie die Tendenz ist.

Code: Alles auswählen

def testit(size=100000, space=10000000000, retrys=10000000):
    from timeit import Timer
   
    start = space
    stop = start + size
    try:
        t = Timer("for i in xrange(%i, %i): pass" % (start, stop))
        print "%7.3f xrange(%i, %i)" % (t.timeit(retrys/size), 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(retrys/size), 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(retrys/size), 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(retrys/size), start, stop)
    
    t = Timer("for i in xlrange24(%i, %i): pass" % (start, stop), "from __main__ import xlrange24")
    print "%7.3f xlrange24(%i, %i)" % (t.timeit(retrys/size), start, stop)
   
if __name__ == "__main__":
    from optparse import OptionParser
    parser = OptionParser()
    parser.add_option("-s", "--size", action="store", dest="size",
                            default=100000, type='int', help="How many items should be created?")
    parser.add_option("-r", "--range", action="store", dest="range",
                            default=10000000000, type='long', help="In which range should be tested?")
    parser.add_option("-i", "--iterations", action="store", dest="iterations",
                            default=10000000, type='int', help="How many times repeated?")
    options = parser.parse_args()[0]
    testit(size=options.size, space=options.range, retrys=options.iterations)