Вряд ли найдется спор в том, что «обертка» может быть быстрее «обертываемого». А на сколько медленнее работает обертка, вот здесь может быть интересно. В этой статье приведу два сценария, делающих одно и тоже в двух вариантах: на SqlAlchemy и чистый psycopg2.
SqlAlchemy это ОРМ для упрощения взаимодействия с базой данных. В случае с PostgreSQL, SqlAlchemy выступает надстройкой над psycopg2, который в свою очередь является адаптером базы данных.
В примерах ниже операции абсолютно одинаковые с той лишь разницей, что в одном случае это делается через SqlAlchemy, в другом на psycopg2.
Как измерить скорость работы скриптов на python.
SqlAlchemy
Код:
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.044077157974243164 seconds —
— 0.044499874114990234 seconds —
psycopg2
""" 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.015745878219604492 seconds —
— 0.009712934494018555 seconds —
Выводы
0.044 (SQLAlchemy) vs 0.0097 (psycopg2)
С ОРМ SQLAlchemy удобнее и быстрее писать код, но как видим проигрывает он по скорости в 3 раза, а в одном из случаев аж в 5 раз.
В своих проектах, там где тяжелые запросы, использую чистый psycopg2. Там где скорость запрос не нужна — SQLAlchemy.