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 — сравниваем скорость"