Ich denke, dass die Verwendung jedes einzelnen viel zu subjektiv ist, als dass ich mich darauf einlassen könnte, also bleibe ich einfach bei Zahlen.
Ich habe die Zeit verglichen, die zum Erstellen und Ändern einer Variablen in einem Diktat, einer new_style-Klasse und einer new_style-Klasse mit Slots benötigt wird.
Hier ist der Code, den ich zum Testen verwendet habe (es ist ein bisschen chaotisch, aber es macht den Job.)
import timeit
class Foo(object):
def __init__(self):
self.foo1 = 'test'
self.foo2 = 'test'
self.foo3 = 'test'
def create_dict():
foo_dict = {}
foo_dict['foo1'] = 'test'
foo_dict['foo2'] = 'test'
foo_dict['foo3'] = 'test'
return foo_dict
class Bar(object):
__slots__ = ['foo1', 'foo2', 'foo3']
def __init__(self):
self.foo1 = 'test'
self.foo2 = 'test'
self.foo3 = 'test'
tmit = timeit.timeit
print 'Creating...\n'
print 'Dict: ' + str(tmit('create_dict()', 'from __main__ import create_dict'))
print 'Class: ' + str(tmit('Foo()', 'from __main__ import Foo'))
print 'Class with slots: ' + str(tmit('Bar()', 'from __main__ import Bar'))
print '\nChanging a variable...\n'
print 'Dict: ' + str((tmit('create_dict()[\'foo3\'] = "Changed"', 'from __main__ import create_dict') - tmit('create_dict()', 'from __main__ import create_dict')))
print 'Class: ' + str((tmit('Foo().foo3 = "Changed"', 'from __main__ import Foo') - tmit('Foo()', 'from __main__ import Foo')))
print 'Class with slots: ' + str((tmit('Bar().foo3 = "Changed"', 'from __main__ import Bar') - tmit('Bar()', 'from __main__ import Bar')))
Und hier ist die Ausgabe ...
Erstellen...
Dict: 0.817466186345
Class: 1.60829183597
Class_with_slots: 1.28776730003
Variable ändern ...
Dict: 0.0735140918748
Class: 0.111714198313
Class_with_slots: 0.10618612142
Wenn Sie also nur Variablen speichern, benötigen Sie Geschwindigkeit und müssen nicht viele Berechnungen durchführen. Ich empfehle die Verwendung eines Diktats (Sie können immer nur eine Funktion erstellen, die wie eine Methode aussieht). Aber wenn Sie wirklich Klassen brauchen, denken Sie daran - verwenden Sie immer __ Slots __ .
Hinweis:
Ich habe die 'Klasse' mit beiden getestet mit den Klassen new_style als auch old_style getestet. Es stellt sich heraus, dass old_style-Klassen schneller zu erstellen, aber langsamer zu ändern sind (nicht viel, aber bedeutsam, wenn Sie viele Klassen in einer engen Schleife erstellen (Tipp: Sie machen es falsch)).
Auch die Zeiten zum Erstellen und Ändern von Variablen können auf Ihrem Computer unterschiedlich sein, da meine alt und langsam sind. Stellen Sie sicher, dass Sie es selbst testen, um die "echten" Ergebnisse zu sehen.
Bearbeiten:
Ich habe das Namedtuple später getestet: Ich kann es nicht ändern, aber um die 10000 Samples (oder ähnliches) zu erstellen, hat es 1,4 Sekunden gedauert, sodass das Wörterbuch tatsächlich das schnellste ist.
Wenn ich die Diktatfunktion so ändere , dass sie die Schlüssel und Werte enthält und das Diktat anstelle der Variablen zurückgibt, die das Diktat enthält, wenn ich es erstelle, gibt es mir 0,65 statt 0,8 Sekunden.
class Foo(dict):
pass
Das Erstellen ist wie eine Klasse mit Slots und das Ändern der Variablen ist am langsamsten (0,17 Sekunden). Verwenden Sie diese Klassen also nicht . Gehen Sie für ein Diktat (Geschwindigkeit) oder für die vom Objekt abgeleitete Klasse ('Syntax Candy')
dict
kann es sinnvoll sein, eine Klasse abzuleiten . ordentlicher Vorteil: Wenn Sie debuggen, sagenprint(request)
Sie einfach und Sie werden sofort alle Statusinformationen sehen. Mit dem klassischeren Ansatz müssen Sie Ihre benutzerdefinierten__str__
Methoden schreiben , was scheiße ist, wenn Sie es die ganze Zeit tun müssen.