SQLAlchemy 比 Psycopg2 更快。我的基准有什么问题?
SQLAlchemy Faster Than Psycopg2. What's Wrong with My Benchmark?
首先,我创建了一个包含 5 列的 table:
CREATE TABLE table1
(
a integer,
b character varying,
c character varying,
d numeric,
e numeric
)
其次,我将 10 万行添加到 table
https://gist.github.com/ericsalim/1d12628826195b52c5d282c2326f5e00
第三,我select所有行都使用Psycopg2和SQLAlchemy
- 使用 Psycopg2:https://gist.github.com/ericsalim/f45d0f0d4babf0e59708c75804eb78c4
- 使用 SQLAlchemy:https://gist.github.com/ericsalim/c8df8adeb9ec49fa8cb1b5c5e8d811f8
Psycopg2 的结果
- 查询时间:2839.46800232
- 转换时间:792.379140854
- 分辨率大小:400036
- 行列表大小:412232
SQLAlchemy 的结果:
- 查询时间:2401.74889565
- 转换时间:377.213001251
- 分辨率大小:412232
- 行列表大小:412232
作为 Psycopg2 之上的 ORM 层的 SQLAlchemy 怎么可能比 Psycopg2 本身更快?我的代码有问题吗?
这是DictCursor
的开销。将其切换为使用标准游标和整数索引会导致 psycopg2
表现出色。我想 SQLAlchemy 使用不同的、更有效的方法来支持字符串索引。但除了学术好奇心之外,我不会担心两者之间的性能差异——关注哪个对你更有效率。在大多数真实场景中,你会受到 I/O 的约束,差异很小,无关紧要。
首先,我创建了一个包含 5 列的 table:
CREATE TABLE table1
(
a integer,
b character varying,
c character varying,
d numeric,
e numeric
)
其次,我将 10 万行添加到 table
https://gist.github.com/ericsalim/1d12628826195b52c5d282c2326f5e00
第三,我select所有行都使用Psycopg2和SQLAlchemy
- 使用 Psycopg2:https://gist.github.com/ericsalim/f45d0f0d4babf0e59708c75804eb78c4
- 使用 SQLAlchemy:https://gist.github.com/ericsalim/c8df8adeb9ec49fa8cb1b5c5e8d811f8
Psycopg2 的结果
- 查询时间:2839.46800232
- 转换时间:792.379140854
- 分辨率大小:400036
- 行列表大小:412232
SQLAlchemy 的结果:
- 查询时间:2401.74889565
- 转换时间:377.213001251
- 分辨率大小:412232
- 行列表大小:412232
作为 Psycopg2 之上的 ORM 层的 SQLAlchemy 怎么可能比 Psycopg2 本身更快?我的代码有问题吗?
这是DictCursor
的开销。将其切换为使用标准游标和整数索引会导致 psycopg2
表现出色。我想 SQLAlchemy 使用不同的、更有效的方法来支持字符串索引。但除了学术好奇心之外,我不会担心两者之间的性能差异——关注哪个对你更有效率。在大多数真实场景中,你会受到 I/O 的约束,差异很小,无关紧要。