@cracki: Dir ging es doch, genauso wie mir, auch darum das die Ergebnisse so "genau" wie möglich sind. Und es ist doch logisch, um so mehr "drumherum" existiert (und dann kommt noch dazu das dass "drumherum" sehr unterschiedlich ist), das sich das auf die Ergebnisse negativ auswirkt.
Z.B.: Sind deine beiden Funktionen was den Speicherverbruach (Größe der Datei, und den Verbrauch im RAM), viel besser als meine Variante. Dagegen sage ich ja auch nichts.
Da sind wir uns alle einig.
Aber, dennoch ist deine Variante für die Sache die ich messen wollte "unbrauchbar" da zuviel Code drumherum ist, der in beiden Funktionen unterschiedlich ist. Das alles verfälscht das Messergebnis, da die "Streuung" von dem "drumherum" nicht linear ausfällt, weil das "drumherum" in beiden Funktionen von dir unterschiedlich ist.
Z.B., wie schon gesagt, verwendest du eine Schleife für die ``+`` Variante die in deiner ``%`` Variante nicht vorkommt. Dann kommt hinzu das, wie schon von Jack gesagt, eine ``x+=y + z`` in einer Iterierenden Methode nicht das gleiche ist wie eine ``x = y + z``. Und wenn man es ganz genau nimmt, dann mist du eigentlich was ganz anderes, als ich Messen wollte.
Der beste Kompromiss (Wenn es den nun stört das die Datei bei 10.000 Objekten so groß ist) das man den Generator der ``output.py`` so verändert, dass nur noch sowas erzeugt wird:
Code: Alles auswählen
str_ = "blubb"
def f1():
return str_ + str_ + ... + N
def f2():
return "%s%s%s ... N %(str_, str_, ... N
Den hier wird dann tatsächlich das gemacht was ich auch messen wollte. Kein drumherum sonder Explizit das was ich wissen will.
Z.B: Sieht ``output.py`` bei ``MAX_OBJ=5`` so aus:
Code: Alles auswählen
str_ = '0' * 80 #Dan eben 80 statt 3000 Zeichen.
def f1():
return str_ + str_ + str_ + str_ + str_
def f2():
return "%s%s%s%s%s" % (str_, str_, str_, str_, str_)
Das ist die sicherste Variante, weil es Explizit das macht was ich Messen wollte. Und mehr erwarte ich auch garnicht.
BTW: Ich finde wenn man was Messen will, sollte man dafür sorgen das so wenig "streuende" Elemente wie möglich daran beteiligt sind, damit das Ergebnis so "genau" wie möglich wird.
Und mal ehrlich: Ich weiß nicht warum du da was am Testverfahren, in Bezug auf Festplattenspeicher und RAM, verbessern willst. Ist doch egal. Der Benchmark macht das was er sollte. Ich habe jedenfalls meine Ergebnisse und kann nun ruhiger schlafen da mir diese Frage nicht mehr durch den Kopf geistert
Nebenbei habe ich auch noch was mitgekriegt, wie Python mit Redundanz umgeht wenn er Bytecode erzeugt.
...
Als nächstes teste ich dann mal die ``+=`` Variante gegen die ``"".join()``-Variante in schleifen. (Ergebnisse kenne wir zwar alle aber denoch will ich das mal selber sehen). Auf die Diskussion bin ich mal gespannt
--> Soviel kann ich schon verraten. Es wird sich am eigentlichen Verfahren nicht viel ändern. Es wird wider ein Generator benutzt der zwei Funktionen erzeugt die Genau das machen was ich testen will
Ich werde aber keine riesige Liste mehr generieren lassen, sondern nur einen String verwenden.
lg