Seite 1 von 1

Geschwindigkeitsfrage: Objekte oder Dictionaries

Verfasst: Montag 13. Juli 2015, 12:01
von AxXel001
Hi Leute,

nachdem ich ein bisschen selbst rumprobiert habe bin ich zu folgendem Ergebnis gekommen:
Wenn man beliebige Daten nur kapseln sowie ein- und auslesen will, so sind Dictionaries schneller als Objekte.

Mein Testcode:

Code: Alles auswählen

>>> class CLS1(object):
... 	def __init__(self, a, b):
... 		self.a = a
... 		self.b = b 
... 
>>> def f1():
... 	o = CLS1(100,200)
... 	o.a 
... 	o.b
... 	o.a = o.b - 5000
... 	o.b = 0
...
>>> def f2():
... 	o = {"a" : 100, "b" : 200}
... 	o["a"]
... 	o["b"]
... 	o["a"] = o["b"] - 5000
... 	o["b"] = 0
... 
>>> def test(f, n):
... 	i = 0
... 	time1 = time.time()
... 	while i < n:
... 		f()
... 		i += 1
... 	time2 = time.time()
... 	print time2-time1
... 
>>> test(f1,2000000)
3.26900005341
>>> test(f2,2000000)
1.83500003815
Gilt dieser Speedfaktor von knapp 1.8 auch im komplexeren Betrieb also mit größeren Dictionaries und sehr viel mehr davon?

Liebe Grüße,
Alex

Re: Geschwindigkeitsfrage: Objekte oder Dictionaries

Verfasst: Montag 13. Juli 2015, 12:38
von Sirius3
@AxXel001: der Zugriff auf Objekt-Attribute ist etwas komplexer, weil ein eventuell vorhandenes __getattribute__ berücksichtigt werden muß. Doch der größte Teil des Zeitunterschieds geht auf das Erzeugen eines Objekts, bzw. eines Wörterbuchs. Ohne Erzeugung ist der Objekt-Zugriff nur 20% langsamer.
Aber auch das spielt normalerweise keine große Rolle, da in Wirklichkeit viel mehr Zeit bei "richtigen" Rechnungen verbraucht wird. Z.B. verbraucht allein Deine while-Schleife 27% der "Rechenzeit". Eine einfachere for-Schleife würde da nur 5% verbrauchen.

Kurz gesagt, solche Art Mikrooptimierung ist unnötige Entwicklerzeit-Verschwendung. Nimm die Struktur, die für Dein Problem optimal ist, das heißt, die die Lesbarkeit optimiert.

Re: Geschwindigkeitsfrage: Objekte oder Dictionaries

Verfasst: Dienstag 14. Juli 2015, 01:45
von DasIch
Man sollte auch Bedenken dass ein Interpreter der ernsthaft optimiert ist (PyPy), den Overhead beim Attribute Lookup und unter Umständen auch den Dictionary Lookup komplett eliminieren kann.