Я думаю, что использование каждого из них слишком субъективно для меня, чтобы заниматься этим, поэтому я просто буду придерживаться цифр.
Я сравнил время, необходимое для создания и изменения переменной в dict, классе new_style и классе 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 (вы всегда можете просто создать функцию, которая выглядит как метод). Но, если вам действительно нужны классы, помните - всегда используйте __ slots __ .
Заметка:
Я тестировал «класс» с обеими new_style и old_style классов. Оказывается, классы old_style быстрее создавать, но медленнее изменять (не сильно, но существенно, если вы создаете много классов в тесном цикле (совет: вы делаете это неправильно)).
Также время для создания и изменения переменных на вашем компьютере может отличаться, так как мой старый и медленный. Убедитесь, что вы проверили его сами, чтобы увидеть «реальные» результаты.
Редактировать:
Позже я протестировал namedtuple: я не могу его изменить, но для создания 10000 образцов (или чего-то подобного) потребовалось 1,4 секунды, поэтому словарь действительно самый быстрый.
Если я изменю функцию dict, чтобы включить ключи и значения и вернуть dict вместо переменной, содержащей dict, когда я ее создаю, это даст мне 0,65 вместо 0,8 секунды.
class Foo(dict):
pass
Создание похоже на класс со слотами, а изменение переменной - самое медленное (0,17 секунды), поэтому не используйте эти классы . перейти к dict (скорость) или к классу, производному от объекта ('синтаксическая конфета')
dict
может иметь смысл наследование класса от до. Отличное преимущество: при отладке просто скажите,print(request)
и вы сразу увидите всю информацию о состоянии. при более классическом подходе вам придется писать свои собственные__str__
методы, что отстой, если вам приходится делать это все время.