为什么使用SQLAlchemy插入数据到sqlite的速度比直接使用sqlite3慢25倍?
为什么使用SQLAlchemy插入数据到sqlite的速度比直接使用sqlite3慢25倍?
为什么使用SQLAlchemy的这个简单测试案例比直接使用sqlite3驱动插入100,000行数据慢25倍?我在真实应用中也遇到了类似的减速问题。我做错了什么吗?
#!/usr/bin/env python # 为什么SQLAlchemy和SQLite这么慢? # 该程序的输出: # SqlAlchemy: 100000条记录的总时间为10.74秒 # sqlite3: 100000条记录的总时间为0.40秒 import time import sqlite3 from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, String, create_engine from sqlalchemy.orm import scoped_session, sessionmaker Base = declarative_base() DBSession = scoped_session(sessionmaker()) class Customer(Base): __tablename__ = "customer" id = Column(Integer, primary_key=True) name = Column(String(255)) def init_sqlalchemy(dbname = 'sqlite:///sqlalchemy.db'): engine = create_engine(dbname, echo=False) DBSession.configure(bind=engine, autoflush=False, expire_on_commit=False) Base.metadata.drop_all(engine) Base.metadata.create_all(engine) def test_sqlalchemy(n=100000): init_sqlalchemy() t0 = time.time() for i in range(n): customer = Customer() customer.name = 'NAME ' + str(i) DBSession.add(customer) DBSession.commit() print "SqlAlchemy: 100000条记录的总时间为 " + str(time.time() - t0) + " 秒" def init_sqlite3(dbname): conn = sqlite3.connect(dbname) c = conn.cursor() c.execute("DROP TABLE IF EXISTS customer") c.execute("CREATE TABLE customer (id INTEGER NOT NULL, name VARCHAR(255), PRIMARY KEY(id))") conn.commit() return conn def test_sqlite3(n=100000, dbname = 'sqlite3.db'): conn = init_sqlite3(dbname) c = conn.cursor() t0 = time.time() for i in range(n): row = ('NAME ' + str(i),) c.execute("INSERT INTO customer (name) VALUES (?)", row) conn.commit() print "sqlite3: 100000条记录的总时间为 " + str(time.time() - t0) + " 秒" if __name__ == '__main__': test_sqlalchemy(100000) test_sqlite3(100000)
我已经尝试了多种变化(请参见http://pastebin.com/zCmzDraU)