Myślę, że użycie każdego z nich jest dla mnie zbyt subiektywne, abym mógł się nad tym zastanowić, więc po prostu trzymam się liczb.
Porównałem czas potrzebny do utworzenia i zmiany zmiennej w dict, klasie new_style i klasie new_style ze slotami.
Oto kod, którego użyłem do przetestowania (jest trochę niechlujny, ale spełnia swoje zadanie).
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')))
A oto wynik ...
Tworzę…
Dict: 0.817466186345
Class: 1.60829183597
Class_with_slots: 1.28776730003
Zmiana zmiennej ...
Dict: 0.0735140918748
Class: 0.111714198313
Class_with_slots: 0.10618612142
Tak więc, jeśli przechowujesz tylko zmienne, potrzebujesz szybkości i nie będzie wymagało to wykonywania wielu obliczeń, zalecam użycie dyktowania (zawsze możesz po prostu utworzyć funkcję, która wygląda jak metoda). Ale jeśli naprawdę potrzebujesz zajęć, pamiętaj - zawsze używaj __ miejsc __ .
Uwaga:
Przetestowałem „Klasę” z obydwoma new_style i klas old_style. Okazuje się, że klasy w starym stylu są szybsze w tworzeniu, ale wolniej się je modyfikuje (niewiele, ale istotne, jeśli tworzysz wiele klas w ciasnej pętli (wskazówka: robisz to źle)).
Również czasy tworzenia i zmieniania zmiennych mogą się różnić na twoim komputerze, ponieważ mój jest stary i powolny. Upewnij się, że sam to przetestujesz, aby zobaczyć „prawdziwe” wyniki.
Edytować:
Później przetestowałem namedtuple: nie mogę go zmodyfikować, ale utworzenie 10000 próbek (lub czegoś podobnego) zajęło 1,4 sekundy, więc słownik jest rzeczywiście najszybszy.
Jeśli zmienię funkcję dict tak, aby zawierała klucze i wartości oraz aby zwracała dict zamiast zmiennej zawierającej dict, kiedy ją utworzę, otrzymam 0,65 zamiast 0,8 sekundy.
class Foo(dict):
pass
Tworzenie jest jak klasa ze szczelinami, a zmiana zmiennej jest najwolniejsza (0,17 sekundy), więc nie używaj tych klas . wybierz dict (prędkość) lub klasę pochodną obiektu („cukierek składniowy”)
dict
może mieć sens. niezła zaleta: kiedy debugujesz, po prostu powiedz,print(request)
a zobaczysz wszystkie informacje o stanie. przy bardziej klasycznym podejściu będziesz musiał napisać własne__str__
metody, co jest do bani, jeśli musisz to robić cały czas.