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

Beitragvon Milan » Donnerstag 16. Dezember 2004, 18:19

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

Beitragvon Dookie » Donnerstag 16. Dezember 2004, 19:20

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


Dookie

Code: Alles auswählen

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

Beitragvon Milan » Donnerstag 16. Dezember 2004, 19:36

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
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Donnerstag 16. Dezember 2004, 19:59

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 Modvoice
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Donnerstag 16. Dezember 2004, 20:11

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: Alles auswählen

#!/usr/bin/env python
import this
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Donnerstag 16. Dezember 2004, 20:24

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 Modvoice
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Beitragvon Milan » Donnerstag 16. Dezember 2004, 20:56

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: ...
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Donnerstag 16. Dezember 2004, 21:14

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 Modvoice

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder