Разница во времени выполнения между psycopg2 и SQLAlchemy

#python #sql #postgresql #sqlalchemy #psycopg2

#python #sql #postgresql #sqlalchemy #psycopg2

Вопрос:

Из чистого любопытства, кто-нибудь знает, почему я испытываю разницу во времени выполнения для точно такой же настройки в SQLAlchemy по сравнению с psycopg2 при подключении к базе данных PostgreSQL?

Из того, что я могу сказать, инициализация SQLAlchemy занимает больше времени, но я не знаю почему. Имеет ли это значение?(Мне рекомендовали SQLAlchemy для psycopg2, но он медленнее). Это занимает примерно в 3 раза больше времени.

 start = time.time() 
    ...: engine_str = 'enginestr' 
    ...: try: 
    ...:         engine = create_engine(engine_str) 
    ...:         conn = engine.connect() 
    ...: except sqlalchemy.exc.OperationalError: 
    ...:         raise ConnectionError("Check VPN connection") 
    ...: ms = Table('measurement_stat',metadata,autoload = True, 
    ...:                autoload_with = engine) 
    ...: times = cf.display_modemap_start_times(ms, 10, conn) 
    ...: stop = time.time() 
    ...: print(stop-start)                                                                                                                                                                                  
3.546764850616455

In [25]: start = time.time() 
    ...: params = {'database': 'dbname', 
    ...:               'user': 'uname', 
    ...:               'password': 'passwd', 
    ...:               'host': 'hostname', 
    ...:               'port': 30000 
    ...:              } 
    ...: try: 
    ...:      conn = pg2.connect(**params, connect_timeout = 5) #connects to postgres 
    ...:      cur = conn.cursor() 
    ...: except pg2.OperationalError: 
    ...:     print("CANNOT CONNECT TO DATABASE.CHECK VPN CONNECTION") 
    ...: modemap_start_sql = F"SELECT timestamp FROM measurement_stat WHERE sensor_name = 'modemap_measurement_status' AND value_cal = 'start_measurement' ORDER BY timestamp DESC LIMIT {10};" 
    ...: cur.execute(modemap_start_sql) 
    ...: start_times = pd.DataFrame(cur.fetchall()) 
    ...: start_times.columns = ['modemap_start_time']     
    ...: stop = time.time() 
    ...: print(stop-start)                                                                                                                                                                                  
1.190742015838623
  

Ответ №1:

Эти пакеты служат разным целям. psycopg реализует протокол обмена данными с базой данных, при этом sqlalchemy добавляет абстракцию объекта поверх полученных необработанных значений.

Фактически, sqlalchemy внутренне используется psycopg для взаимодействия с базой данных, поэтому нет способа, которым это может быть быстрее или даже таким же, из-за накладных расходов на создание объекта.

Причиной использования sqlalchemy является удобство сопровождения кода, а не скорость. Если у вас нетривиальная система, каждое изменение в базе данных будет приводить к массовым изменениям кода и сопутствующим ошибкам. С sqlalchemy вам нужно изменить только одно определение объекта, чтобы соответствовать новой структуре БД.

Комментарии:

1. Спасибо! Да, я знал о накладных расходах на создание объекта. Однако я не ожидал, что разница будет такой большой. Похоже, что метаданные — это та часть, которая занимает больше всего времени, и я не совсем уверен, почему этот шаг вообще необходим в отличие от psycopg2.