Разбитые надежды или просто непонимание?

В одной из лекций с PyCon US 2014 проскочила очень заинтересовавшая меня информация о том, что с Python 3.3 CPython поддерживает оптимизацию для классов, и старый вариант использования Python, когда класс могли просто заменить на Dict не верен в корне, т.к. Dict не поддерживает никакой типизации. Вроде все верно и логично: никак не ограничиваемый по данным ассоциативный массив против класса, в котором можно предсказать используемые типы и количество полей.
Выглядит это как так:

class Foo:
    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)

Создадим всего две функции make_dict() 1 для генерации словаря с тремя элементами и make_foo() 2 для генерации класса с полями аналогичными по содержанию.

Если верить лектору, то в случае использования Python < 3.3, быстрее должен оказаться вариант с функцией 1:

[make_dict() for i in range(1000)]

А вот на Python >= 3.3 вариант 2:

[make_foo() for i in range(1000)]

На моих же замерах в обоих случаях получилось, что первый вариант выполняется, в среднем, за 410 µs, а второй за 850 µs. Я как-то не так это измерял или что-то не понял?

Хотя, если взять pypy, то все вроде как становится так, как и утверждалось: 127 µs на вариант с Dict и 96 µs на вариант с классом.

Выходит что, до тех пока PyPy не дойдет до более-менее промышленного уровня, Dict все еще эффективнее для хранения данных, нежели класс?

Leave a Reply