xrange für longs

Code-Stücke können hier veröffentlicht werden.
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Hi. Schöne Sache, aber was ist mit xlrange3(-sys.maxint-2,sys.maxint+1,10000) ?
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Wie gesagt, erste Version und xrange3 hab ich nur auf die schnelle hingeschrieben :)


Dookie
[code]#!/usr/bin/env python
import this[/code]
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

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

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

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
[code]#!/usr/bin/env python
import this[/code]
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