【问题标题】:Execution time difference between psycopg2 and SQLAlchemypsycopg2 和 SQLAlchemy 的执行时间差
【发布时间】:2020-12-07 04:23:43
【问题描述】:

出于纯粹的好奇,有谁知道为什么在连接到 PostgreSQL 数据库时,与 psycopg2 中完全相同的设置在 SQLAlchemy 中的执行时间会有所不同?

据我所知,SQLAlchemy 的初始化时间更长,但我不知道为什么。这有关系吗?(我被推荐使用 psycopg2 的 SQLAlchemy,但速度较慢)。它需要大约 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

【问题讨论】:

    标签: python sql postgresql sqlalchemy psycopg2


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢!是的,我知道对象创建开销。但是,我没想到差异会那么大。似乎 MetaData 是花费时间最长的部分,我不太确定为什么与 psycopg2 不同,这一步甚至是必要的。
    猜你喜欢
    • 2016-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-18
    • 1970-01-01
    • 1970-01-01
    • 2012-03-14
    • 2016-11-21
    相关资源
    最近更新 更多