psycopg2和SQLAlchemy之间的执行时间差

问题描述

出于好奇,没有人知道为什么我在连接到Postgresql DB时与psycopg2相比在sqlAlchemy中完全相同的设置在执行时间上有所不同吗?

据我所知,sqlAlchemy需要花费更长的时间进行初始化,但我不知道为什么。这有关系吗?(建议我使用psycopg2的sqlAlchemy,但速度较慢)。大约需要三倍的时间。

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

解决方法

这些软件包有不同的用途。 psycopg实现了与数据库对话的协议,而sqlalchemy在获得的原始值之上添加了对象抽象。

实际上,sqlalchemy在内部使用psycopg与数据库进行通信,因此由于对象创建的开销,它不可能更快甚至相同。

使用sqlalchemy的原因是代码的可维护性,而不是速度。如果您的系统很简单,那么数据库中的每个更改都会以大量的代码更改和附带的错误传播。使用sqlalchemy,您只需更改一个对象定义即可匹配新的数据库结构。