query = "INSERT INTO my_table (a,b,c ... ) VALUES (%s, %s, %s ...)";
for d in data:
cursor.execute(query, d)
我随后重写了我的脚本,使其创建一个内存文件,然后用于Postgres的COPY
命令,该命令允许我将数据从文件复制到我的表中:
f = StringIO(my_tsv_string)
cursor.copy_expert("COPY my_table FROM STDIN WITH CSV DELIMITER AS E'\t' ENCODING 'utf-8' QUOTE E'\b' NULL ''", f)
< p > COPY
方法速度惊人地快。 < /p >
METHOD | TIME (secs) | # RECORDS
=======================================
COPY_FROM | 92.998 | 48339
INSERT | 1011.931 | 48377
但我找不到任何关于为什么的信息?它与多行INSERT
有何不同,以至于它能更快地工作呢?
另请参见此基准测试:
# original
0.008857011795043945: query_builder_insert
0.0029380321502685547: copy_from_insert
# 10 records
0.00867605209350586: query_builder_insert
0.003248929977416992: copy_from_insert
# 10k records
0.041108131408691406: query_builder_insert
0.010066032409667969: copy_from_insert
# 1M records
3.464181900024414: query_builder_insert
0.47070908546447754: copy_from_insert
# 10M records
38.96936798095703: query_builder_insert
5.955034017562866: copy_from_insert
psycopg2
默认情况下不自动提交,第一条语句会开启一个事务并保持打开状态直到显式提交。通常情况下你是对的,但对于 Python 来说不一定如此。 - Craig Ringer