В одной из лекций с PyCon US 2014 проскочила очень заинтересовавшая меня информация о том, что с Python 3.3 CPython поддерживает оптимизацию для классов, и старый вариант использования Python, когда класс могли просто заменить на Dict не верен в корне, т.к. Dict не поддерживает никакой типизации. Вроде все верно и логично: никак не ограничиваемый по данным ассоциативный массив против класса, в котором можно предсказать используемые типы и количество полей.
Выглядит это как так:
def __init__(self, a, b, c):
self.a = a
self.b = b
self.c = c
def make_dict(): # (1)
return {"a" : 1,
"b" : 2,
"c" : 3
}
def make_foo(): # (2)
return Foo(1, 2, 3)
Создадим всего две функции
Если верить лектору, то в случае использования Python < 3.3, быстрее должен оказаться вариант с функцией
А вот на Python >= 3.3 вариант
На моих же замерах в обоих случаях получилось, что первый вариант выполняется, в среднем, за 410 µs, а второй за 850 µs. Я как-то не так это измерял или что-то не понял?
Хотя, если взять pypy, то все вроде как становится так, как и утверждалось: 127 µs на вариант с Dict и 96 µs на вариант с классом.
Выходит что, до тех пока PyPy не дойдет до более-менее промышленного уровня, Dict все еще эффективнее для хранения данных, нежели класс?