[Python-de] 1,2,3,5,7,8,9 -> "1-3,5,7-9"

Christian Tismer tismer at stackless.com
Die Jun 22 11:23:38 CEST 2004


Alexander 'boesi' Bösecke wrote:

> Am 21.06.2004 16:31:53 schrieb Christian Tismer:
> 
>>>    resListe.extend(('-', `last`, ',', `element`))
>>
>>Aber vermutlich hast Du hier unabsichtlich ein Tupel
>>kreiert, was zu einer Liste konvertiert werden muß.
>>Keine Zeit zum testen, aber wie benimmt sich
>>
>>     resListe.extend(['-', `last`, ',', `element`])
> 
> 
> Aehm noe also eigentlich bin ich ganz spontan davon ausgegangen, dass
> das Erzeugen eines Tupel schneller geht als das einer Liste. Warum kann
> ich nicht sagen und auch nicht ob das stimmt, aber...
> 
> Anzahl Listenelemente: 1000000
> Anzahl Loops: 100
> Laufzeit pro Loop im Schnitt:
>   boesi     :    2.0425 sec (resListe.append('-' + `last` + ',' + `element`))
>   boesi2    :    2.1516 sec (resListe.extend(('-', `last`, ',',`element`)))
>   boesi3    :    2.3793 sec (resListe.append('-%d,%d' % (last, element)))
>   boesi4    :    2.3118 sec (resListe.extend(['-', `last`, ',', `element`]))

Das ist allerdings erstaunlich und unerwartet.
Ich hatte vermutet, daß das Tupel zunächst in eine
Liste gewandelt würde, die dann zum Extend benutzt wird.
Aber offensichtlich wird das Sequence-Protokoll direkt benutzt,
und in der Tat sind Tupel schneller erstellt, insbesondere,
weil sie einen eigenen Objekt-Cache haben und Du in diesem
Fall immer wieder daselbbe Objekt bekommst.

Die Idee mit repr als "`" geschrieben scheint gut, spart
Opcodes.

boesi3    :    2.3793 sec (resListe.append('-%d,%d' % (last, element)))

Hier kommen wohl die Extra-Kosten für das Formatier-Tupel hinzu.

boesi3    :    2.3793 sec (resListe.append('-%d,%d' % (last, element)))

Probierbar wäre .append('-%d,%%d' % last % element)
wobei ich vermute, es ist nicht viel besser. Das Tupel wird gespart,
dafür wird zweimal formatiert.

Aaaber eine Sache kannst Du evtl. noch machen. Die erwünschte
Schreibweise impliziert doch, daß die Liste keine negativen
Zahlen enthalten kann? Also kommt auch kein "bis 0" vor.
Dann ist es evtl. billiger, eine positive Zahl negativ zu machen:

   resListe.append(`-last` + ',' + `element`)

Interessant, ciao - chris
-- 
Christian Tismer             :^)   <mailto:tismer at stackless.com>
Mission Impossible 5oftware  :     Have a break! Take a ride on Python's
Johannes-Niemeyer-Weg 9a     :    *Starship* http://starship.python.net/
14109 Berlin                 :     PGP key -> http://wwwkeys.pgp.net/
work +49 30 89 09 53 34  home +49 30 802 86 56  mobile +49 173 24 18 776
PGP 0x57F3BF04       9064 F4E1 D754 C2FF 1619  305B C09C 5A3B 57F3 BF04
      whom do you want to sponsor today?   http://www.stackless.com/