#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.