如何解决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
,您只需更改一个对象定义即可匹配新的数据库结构。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。