SqlAlchemy vs psycopg2 — сравниваем скорость

Admin PostgreSQL, SQLAlchemy

Вряд ли найдется спор в том, что «обертка» может быть быстрее «обертываемого». А на сколько медленнее работает обертка, вот здесь может быть интересно. В этой статье приведу два сценария, делающих одно и тоже в двух вариантах: на SqlAlchemy и чистый psycopg2.

SqlAlchemy это ОРМ для упрощения взаимодействия с базой данных. В случае с PostgreSQL, SqlAlchemy выступает надстройкой над psycopg2, который в свою очередь является адаптером базы данных.

В примерах ниже операции абсолютно одинаковые с той лишь разницей, что в одном случае это делается через SqlAlchemy, в другом на psycopg2.

Как измерить скорость работы скриптов на python.

SqlAlchemy

Код:

def __save_operations(operations, user_id):
    for operation in operations:
        exist = db.session.query(Operation.id).filter_by(id_operation=operation['id_operation']).first()

        if not exist:
            new = Operation(
                user_id=user_id,
                id_operation=operation['id_operation'],
                name=operation['name'],
                currency=operation['currency'],
                price=operation['price'],
                quantity=operation['quantity'],
                payment=operation['payment'],
                commission=operation['commission'],
                operation_type=operation['operation_type'],
                date=operation['date']
            )
            db.session.add(new)
            log_message(operation['name'], 'Добавлена новая операция')
    db.session.commit()

Выходные данные:

Запускаются обновления
02:41:21 | Cinemark Holdings Inc | Добавлена новая операция
02:41:21 | Macerich | Добавлена новая операция
02:41:21 | Macerich | Добавлена новая операция
02:41:21 | Macerich | Добавлена новая операция
02:41:21 | Macerich | Добавлена новая операция
02:41:21 | American Airlines Group | Добавлена новая операция
02:41:21 | American Airlines Group | Добавлена новая операция
02:41:21 | Spirit Airlines Inc | Добавлена новая операция
02:41:21 | Carnival | Добавлена новая операция
02:41:21 | Carnival | Добавлена новая операция
02:41:21 | Macerich | Добавлена новая операция
02:41:21 | American Airlines Group | Добавлена новая операция
02:41:21 | Spirit Airlines Inc | Добавлена новая операция
02:41:21 | Carnival | Добавлена новая операция
02:41:21 | Carnival | Добавлена новая операция
02:41:21 | Cinemark Holdings Inc | Добавлена новая операция
— 0.04560375213623047 seconds —

Все замеры:

— 0.04560375213623047 seconds —
— 0.044077157974243164 seconds —
— 0.044499874114990234 seconds —

psycopg2

def __save_operations(operations, user_id):
    """ Add shares to DB """
    for operation in operations:
        query = """
            INSERT INTO operations (user_id, id_operation, name, currency, price, quantity, payment,
            commission, operation_type, date)
            VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
            ON CONFLICT DO NOTHING
        ;"""


        db_psycopg.query_update(query, (user_id,
                                        operation['id_operation'],
                                        operation['name'],
                                        operation['currency'],
                                        operation['price'],
                                        operation['quantity'],
                                        operation['payment'],
                                        operation['commission'],
                                        operation['operation_type'],
                                        operation['date']))
        log_message(operation['name'], 'Добавлена новая операция')

def query_update(self, query, arg, message=None):
    """ Обновляет данные в таблице и возвращает сообщение об успешной операции """
    try:
        cur = self.conn.cursor()
        cur.execute(query, arg)
        return message

    except (Exception, psycopg2.Error) as error:
        self.__error(error)

Все замеры:

— 0.012418031692504883 seconds —
— 0.015745878219604492 seconds —
— 0.009712934494018555 seconds —

Выводы

Лучший результат в секундах:
0.044 (SQLAlchemy) vs 0.0097 (psycopg2)

С ОРМ SQLAlchemy удобнее и быстрее писать код, но как видим проигрывает он по скорости в 3 раза, а в одном из случаев аж в 5 раз.

В своих проектах, там где тяжелые запросы, использую чистый psycopg2. Там где скорость запрос не нужна — SQLAlchemy.

Метки:

У сайта нет цели самоокупаться, поэтому на сайте нет рекламы. Но если вам пригодилась информация, можете лайкнуть страницу, оставить комментарий или отправить мне подарок на чашечку кофе.

Добавить комментарий

Напишите свой комментарий, если вам есть что добавить/поправить/спросить по теме текущей статьи:
"SqlAlchemy vs psycopg2 — сравниваем скорость"