Geschwindigkeitsfrage: Objekte oder Dictionaries

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
AxXel001
User
Beiträge: 29
Registriert: Sonntag 7. Juni 2015, 22:22

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
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

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.
Antworten