xrange für longs

Code-Stücke können hier veröffentlicht werden.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

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: ...
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten