Я думаю, що використання кожного з них є занадто суб'єктивним для мене, щоб зайнятися цим, тому я просто дотримуюся цифр.
Я порівняв час, необхідний для створення та зміни змінної у dict, класі new_style та class new_style зі слотами.
Ось код, який я використовував для його тестування (він трохи безладний, але він робить роботу.)
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')))
І ось вихід ...
Створення ...
Dict: 0.817466186345
Class: 1.60829183597
Class_with_slots: 1.28776730003
Зміна змінної ...
Dict: 0.0735140918748
Class: 0.111714198313
Class_with_slots: 0.10618612142
Отже, якщо ви просто зберігаєте змінні, вам потрібна швидкість, і це не вимагатиме від вас багато обчислень, я рекомендую використовувати dict (ви завжди можете просто зробити функцію, схожу на метод). Але якщо вам справді потрібні заняття, пам’ятайте - завжди використовуйте __ слоти __ .
Примітка:
Я перевірив 'Клас' як з класами new_style, так і old_style. Виявляється, класи old_style створюються швидше, але повільніше змінюються (не набагато, але суттєво, якщо ви створюєте безліч класів в щільному циклі (порада: ви робите це неправильно)).
Також час створення та зміни змінних може відрізнятися на вашому комп'ютері, оскільки мій старий і повільний. Переконайтесь, що ви протестуєте його самостійно, щоб побачити "справжні" результати.
Редагувати:
Пізніше я протестував namedtuple: я не можу змінити його, але для створення 10000 зразків (або чогось подібного) це зайняло 1,4 секунди, тому словник справді найшвидший.
Якщо я зміню функцію dict, щоб включати ключі та значення та повертати дік замість змінної, що містить дікт, коли я створюю, це дає мені 0,65 замість 0,8 секунди.
class Foo(dict):
pass
Створення - це як клас із слотами, а зміна змінної - найповільніша (0,17 секунди), тому не використовуйте ці класи . перейти на дікт (швидкість) або на клас, похідний від об'єкта ("синтаксична цукерка")
dict
може мати сенс, до. акуратна перевага: коли ви налагодите, просто скажіть,print(request)
і ви легко побачите всю інформацію про стан. при більш класичному підході вам доведеться писати свої власні__str__
методи, що гасить, якщо вам доведеться це робити постійно.