Peewee批量插入數(shù)據(jù)

Peewee系列:
Peewee 使用
Peewee使用之事務(wù)
Peewee批量插入數(shù)據(jù)
Peewee 使用(二)——增刪改查更詳細(xì)使用


最近,需要同步數(shù)據(jù)到Mysql中,數(shù)據(jù)量有幾百萬。但是,自己寫一個(gè)for循環(huán),然后使用Model.create()添加,發(fā)現(xiàn)這種方式特別慢。難道,像去年爬數(shù)據(jù)一樣,將幾百萬的數(shù)據(jù)從Redis取出來,然后使用多線程進(jìn)行保存?

在Google上搜索了之后,找到一種更簡(jiǎn)單的方式,那就是使用Peewee原生的方法insert_many(),進(jìn)行批量數(shù)據(jù)插入。

那么,它的速度有多快?

下面,是我簡(jiǎn)單的比較了插入10000條數(shù)據(jù)到本地?cái)?shù)據(jù)庫(kù)中,四種方式所需要的時(shí)間。

第一種,for循環(huán)和Model.create()

代碼如下:

from xModels import XUser, database
import time

NUM = 10000
start_time = time.time()

users = []
for i in range(NUM):
    XUser.create(phone='13847374833', password='123456')

print("插入{}條數(shù)據(jù), 花費(fèi): {:.3}秒".format(NUM, time.time()-start_time))

結(jié)果:插入10000條數(shù)據(jù), 花費(fèi): 10.5秒

第二種,for循環(huán)和Model.create(),并放入事務(wù)中

代碼如下:

from xModels import XUser, database
import time

NUM = 10000
start_time = time.time()

with database.atomic():
    for i in range(NUM):
        XUser.create(phone='13847374833', password='123456')

print("插入{}條數(shù)據(jù), 花費(fèi): {:.3}秒".format(NUM, time.time()-start_time))

結(jié)果:插入10000條數(shù)據(jù), 花費(fèi): 4.94秒

第三種,使用原生的insert_many()方法

from xModels import XUser, database
import time

NUM = 10000
data = [{
            'phone': '13847374833',
            'password': '123456'
        } for i in range(NUM)]

start_time = time.time()

for i in range(0, NUM, 100):
    XUser.insert_many(data[i:i + 100]).execute()

print("插入{}條數(shù)據(jù), 花費(fèi): {:.3}秒".format(NUM, time.time()-start_time))

結(jié)果:插入10000條數(shù)據(jù), 花費(fèi): 0.505秒

第四種,使用原生的insert_many()方法,并放入事務(wù)中

from xModels import XUser, database
import time

NUM = 10000
data = [{
            'phone': '13847374833',
            'password': '123456'
        } for i in range(NUM)]

start_time = time.time()

with database.atomic():
    for i in range(0, NUM, 100):
        # 每次批量插入100條,分成多次插入
        XUser.insert_many(data[i:i + 100]).execute()

print("插入{}條數(shù)據(jù), 花費(fèi): {:.3}秒".format(NUM, time.time()-start_time))

結(jié)果:插入10000條數(shù)據(jù), 花費(fèi): 0.401秒

結(jié)論

  • insert_many()比使用for+Model.create()方式快很多,在上面例子中快了十倍不止
  • 使用事務(wù),可以些許提升

參考

Python中peewee模塊

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容