2018-06-11 SQLAlchemy批量插入性能比較

轉(zhuǎn)載自:
SQLAlchemy批量插入性能比較

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())  
engine = None  
  
  
class Customer(Base):  
    __tablename__ = "customer"  
    id = Column(Integer, primary_key=True)  
    name = Column(String(255))  
  
  
def init_sqlalchemy(dbname='sqlite:///sqlalchemy.db'):  
    global engine  
    engine = create_engine(dbname, echo=False)  
    DBSession.remove()  
    DBSession.configure(bind=engine, autoflush=False, expire_on_commit=False)  
    Base.metadata.drop_all(engine)  
    Base.metadata.create_all(engine)  
  
  
def test_sqlalchemy_orm(n=100000):  
    init_sqlalchemy()  
    t0 = time.time()  
    for i in xrange(n):  
        customer = Customer()  
        customer.name = 'NAME ' + str(i)  
        DBSession.add(customer)  
        if i % 1000 == 0:  
            DBSession.flush()  
    DBSession.commit()  
    print(  
        "SQLAlchemy ORM: Total time for " + str(n) +  
        " records " + str(time.time() - t0) + " secs")  
  
  
def test_sqlalchemy_orm_pk_given(n=100000):  
    init_sqlalchemy()  
    t0 = time.time()  
    for i in xrange(n):  
        customer = Customer(id=i+1, name="NAME " + str(i))  
        DBSession.add(customer)  
        if i % 1000 == 0:  
            DBSession.flush()  
    DBSession.commit()  
    print(  
        "SQLAlchemy ORM pk given: Total time for " + str(n) +  
        " records " + str(time.time() - t0) + " secs")  
  
  
def test_sqlalchemy_orm_bulk_save_objects(n=100000):  
    init_sqlalchemy()  
    t0 = time.time()  
    n1 = n  
    while n1 > 0:  
        n1 = n1 - 10000  
        DBSession.bulk_save_objects(  
            [  
                Customer(name="NAME " + str(i))  
                for i in xrange(min(10000, n1))  
            ]  
        )  
    DBSession.commit()  
    print(  
        "SQLAlchemy ORM bulk_save_objects(): Total time for " + str(n) +  
        " records " + str(time.time() - t0) + " secs")  
  
def test_sqlalchemy_orm_bulk_insert(n=100000):  
    init_sqlalchemy()  
    t0 = time.time()  
    n1 = n  
    while n1 > 0:  
        DBSession.bulk_insert_mappings(  
            Customer,  
            [  
                dict(name="NAME " + str(i))  
                for i in xrange(min(10000, n1))  
            ]  
        )  
        n1 = n1 - 10000  
    DBSession.commit()  
    print(  
        "SQLAlchemy ORM bulk_insert_mappings(): Total time for " + str(n) +  
        " records " + str(time.time() - t0) + " secs")  
  
def test_sqlalchemy_core(n=100000):  
    init_sqlalchemy()  
    t0 = time.time()  
    engine.execute(  
        Customer.__table__.insert(),  
        [{"name": 'NAME ' + str(i)} for i in xrange(n)]  
    )  ##==> engine.execute('insert into ttable (name) values ("NAME"), ("NAME2")')  
    print(  
        "SQLAlchemy Core: Total time for " + str(n) +  
        " records " + str(time.time() - t0) + " secs")  
  
  
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 xrange(n):  
        row = ('NAME ' + str(i),)  
        c.execute("INSERT INTO customer (name) VALUES (?)", row)  
    conn.commit()  
    print(  
        "sqlite3: Total time for " + str(n) +  
        " records " + str(time.time() - t0) + " sec")  
  
if __name__ == '__main__':  
    test_sqlalchemy_orm(100000)  
    test_sqlalchemy_orm_pk_given(100000)  
    test_sqlalchemy_orm_bulk_save_objects(100000)  
    test_sqlalchemy_orm_bulk_insert(100000)  
    test_sqlalchemy_core(100000)  
    test_sqlite3(100000)  

上面代碼分別使用了orm拌屏, orm帶主鍵骇陈,orm的bulk_save_objects, orm的bulk_insert_mappings, 非orm形式伏穆,原生的dbapi方式闲坎;插入10000條記錄的結(jié)果如下:

SQLAlchemy ORM: Total time for 100000 records 7.2070479393 secs  
SQLAlchemy ORM pk given: Total time for 100000 records 4.28471207619 secs  
SQLAlchemy ORM bulk_save_objects(): Total time for 100000 records 1.58296084404 secs  
SQLAlchemy ORM bulk_insert_mappings(): Total time for 100000 records 0.453973054886 secs  
SQLAlchemy Core: Total time for 100000 records 0.210998058319 secs  
sqlite3: Total time for 100000 records 0.136252880096 sec  
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末旺垒,一起剝皮案震驚了整個(gè)濱河市寨躁,隨后出現(xiàn)的幾起案子宛裕,更是在濱河造成了極大的恐慌瑟啃,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,376評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件揩尸,死亡現(xiàn)場離奇詭異蛹屿,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)岩榆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門错负,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人勇边,你說我怎么就攤上這事犹撒。” “怎么了粥诫?”我有些...
    開封第一講書人閱讀 156,966評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵油航,是天一觀的道長。 經(jīng)常有香客問我怀浆,道長谊囚,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,432評(píng)論 1 283
  • 正文 為了忘掉前任执赡,我火速辦了婚禮镰踏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘沙合。我一直安慰自己奠伪,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評(píng)論 6 385
  • 文/花漫 我一把揭開白布首懈。 她就那樣靜靜地躺著绊率,像睡著了一般。 火紅的嫁衣襯著肌膚如雪究履。 梳的紋絲不亂的頭發(fā)上滤否,一...
    開封第一講書人閱讀 49,792評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音最仑,去河邊找鬼藐俺。 笑死炊甲,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的欲芹。 我是一名探鬼主播卿啡,決...
    沈念sama閱讀 38,933評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼菱父!你這毒婦竟也來了颈娜?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,701評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤滞伟,失蹤者是張志新(化名)和其女友劉穎揭鳞,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體梆奈,經(jīng)...
    沈念sama閱讀 44,143評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡野崇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了亩钟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片乓梨。...
    茶點(diǎn)故事閱讀 38,626評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖清酥,靈堂內(nèi)的尸體忽然破棺而出扶镀,到底是詐尸還是另有隱情,我是刑警寧澤焰轻,帶...
    沈念sama閱讀 34,292評(píng)論 4 329
  • 正文 年R本政府宣布臭觉,位于F島的核電站,受9級(jí)特大地震影響辱志,放射性物質(zhì)發(fā)生泄漏蝠筑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評(píng)論 3 313
  • 文/蒙蒙 一揩懒、第九天 我趴在偏房一處隱蔽的房頂上張望什乙。 院中可真熱鬧,春花似錦已球、人聲如沸臣镣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽忆某。三九已至,卻和暖如春阔蛉,著一層夾襖步出監(jiān)牢的瞬間弃舒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國打工馍忽, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留棒坏,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓遭笋,卻偏偏與公主長得像坝冕,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子瓦呼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)載喂窟,覺得這篇寫 SQLAlchemy Core,寫得非常不錯(cuò)央串。不過后續(xù)他沒寫SQLAlchemy ORM... ...
    非夢nj閱讀 5,379評(píng)論 1 14
  • 原文:https://my.oschina.net/liuyuantao/blog/751438 查詢集API 參...
    陽光小鎮(zhèn)少爺閱讀 3,813評(píng)論 0 8
  • Hi磨澡,三十歲的我,你好质和!是歲月太匆匆了吧稳摄,眨眼的功你的年齡就以三打頭了,而且是個(gè)不容改變的事實(shí)饲宿。 三十歲的你還是沒...
    貪婪豬小妹閱讀 1,853評(píng)論 0 0
  • 帶本科生做實(shí)驗(yàn)的時(shí)候發(fā)生的一件事瘫想。 本來是兩兩合作的實(shí)驗(yàn) 看到一個(gè)組變成三個(gè)臭皮匠 另一個(gè)組則變成一個(gè)諸葛亮孤軍奮...
    Ethonal閱讀 393評(píng)論 0 0
  • 《丁酉雞年五月廿九》 陽歷二〇一七年六月二十三日 你在夏至日的句尾悄然盛開仗阅,在晝的長存里微笑,在夜的短暫中禱告国夜,上...
    王春華閱讀 541評(píng)論 0 0