利用DeepSeek改寫并增強測試Duckdb和sqlite的不同插入方法性能

在前文基礎上,好奇作為事務型數據庫的SQLite表現怎么樣,讓DeepSeek來幫忙。
提示詞

請仿照附件編寫用python插入sqlite數據的測試函數,如果sqlite3沒有對應方法就省略

import sqlite3
import pandas as pd
import timemethods = ['字符串拼接', '綁定變量循環', 'executemany批量', 'VALUES批量', 'DataFrame插入']
trans = ['自動提交', '事務']def test_sqlite_insert(method, n, tran):conn = sqlite3.connect(":memory:")cursor = conn.cursor()cursor.execute("CREATE TABLE t(a INT)")data = [(i,) for i in range(n)]df = pd.DataFrame({'a': range(n)})if tran == 1:conn.execute("BEGIN")start_time = time.time()try:if method == 0:  # 字符串拼接for i in range(n):cursor.execute(f"INSERT INTO t VALUES ({i})")elif method == 1:  # 綁定變量循環for i in range(n):cursor.execute("INSERT INTO t VALUES (?)", (i,))elif method == 2:  # executemany批量cursor.executemany("INSERT INTO t VALUES (?)", data)elif method == 3:  # VALUES批量batch_size = 1000for i in range(0, n, batch_size):batch = range(i, min(i+batch_size, n))values = ",".join(f"({x})" for x in batch)cursor.execute(f"INSERT INTO t VALUES {values}")elif method == 4:  # DataFrame插入df.to_sql('t', conn, if_exists='append', index=False)if tran == 1:conn.commit()except Exception as e:if tran == 1:conn.rollback()raise eelapsed = round(time.time() - start_time, 2)print(f"{trans[tran]} {methods[method]}{elapsed}s")conn.close()return elapseddef run_sqlite_tests(n=10000):print(f"\nSQLite 插入性能測試 (n={n})")print("="*40)for m in range(len(methods)):for t in range(2):test_sqlite_insert(m, n, t)# 測試單條SQL批量插入(分批次)conn = sqlite3.connect(":memory:")cursor = conn.cursor()cursor.execute("CREATE TABLE t(a INT)")start_time = time.time()batch_size = 1000for i in range(0, n, batch_size):batch = range(i, min(i+batch_size, n))values = ",".join(f"({x})" for x in batch)cursor.execute(f"INSERT INTO t VALUES {values}")conn.commit()elapsed = round(time.time() - start_time, 2)print(f"單條SQL批量插入(分批次):{elapsed}s")conn.close()if __name__ == "__main__":run_sqlite_tests()

提示詞

請為duckdb也增加INSERT INTO t VALUES(1),(2),(3)…這種批量方法的測試

import duckdb
import pandas as pd
import timemethods = ['字符串拼接', '綁定變量循環', '綁定變量批量', 'VALUES批量', 'DataFrame插入']
trans = ['自動提交', '事務']def test_duckdb_insert(method, n, con, tran):con.execute("CREATE OR REPLACE TABLE t(a INT)")if tran == 1:con.execute("BEGIN TRANSACTION")start_time = time.time()if method == 0:  # 字符串拼接for i in range(n):con.execute("INSERT INTO t SELECT "+str(i))elif method == 1:  # 綁定變量循環for i in range(n):con.execute("INSERT INTO t VALUES (?)", [i])elif method == 2:  # 綁定變量批量data = [[i] for i in range(n)]con.executemany("INSERT INTO t VALUES (?)", data)elif method == 3:  # VALUES批量batch_size = 1000for i in range(0, n, batch_size):batch = range(i, min(i+batch_size, n))values = ",".join(f"({x})" for x in batch)con.execute(f"INSERT INTO t VALUES {values}")elif method == 4:  # DataFrame插入df = pd.DataFrame({'a': range(n)})con.register('temp_df', df)con.execute("INSERT INTO t SELECT a FROM temp_df")con.unregister('temp_df')if tran == 1:con.execute("COMMIT")elapsed = round(time.time() - start_time, 2)print(f"{trans[tran]} {methods[method]}{elapsed}s")return elapseddef run_duckdb_tests(n=10000):con = duckdb.connect(database=":memory:")print(f"\nDuckDB 插入性能測試 (n={n})")print("="*40)for m in range(len(methods)):for t in range(2):test_duckdb_insert(m, n, con, t)# 測試使用range函數直接生成數據start_time = time.time()con.execute("CREATE OR REPLACE TABLE t(a INT)")con.execute(f"INSERT INTO t SELECT i FROM range({n}) t(i)")elapsed = round(time.time() - start_time, 2)print(f"使用range函數批量插入:{elapsed}s")con.close()if __name__ == "__main__":run_duckdb_tests()

測試結果如下

python pysqlite3.txtSQLite 插入性能測試 (n=10000)
========================================
自動提交 字符串拼接:0.08s
事務 字符串拼接:0.08s
自動提交 綁定變量循環:0.02s
事務 綁定變量循環:0.03s
自動提交 executemany批量:0.02s
事務 executemany批量:0.02s
自動提交 VALUES批量:0.02s
事務 VALUES批量:0.02s
自動提交 DataFrame插入:0.02s
事務 DataFrame插入:0.02s
單條SQL批量插入(分批次):0.02spython pyduckdb3.txtDuckDB 插入性能測試 (n=10000)
========================================
自動提交 字符串拼接:5.53s
事務 字符串拼接:4.2s
自動提交 綁定變量循環:6.22s
事務 綁定變量循環:5.02s
自動提交 綁定變量批量:2.99s
事務 綁定變量批量:1.79s
自動提交 VALUES批量:0.08s
事務 VALUES批量:0.08s
自動提交 DataFrame插入:0.01s
事務 DataFrame插入:0.0s
使用range函數批量插入:0.0s

可見,sqlite的單行插入性能比duckdb高出很多,基本差2個數量級。sqlite綁定變量比拼接也有明顯提高,它的executemany批量也和在VALUES中列舉多個值的批量效果相當。Duckdb的VALUES批量插入效率也比較高。我原先不知道還有這種方法,DeepSeek的知識還真全面。pandas的DataFrame插入在兩種數據庫中都很高效。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/92642.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/92642.shtml
英文地址,請注明出處:http://en.pswp.cn/web/92642.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

進程管理塊(PCB):操作系統進程管理的核心數據結構

進程管理塊(PCB):操作系統進程管理的核心數據結構在現代操作系統中,進程管理塊(Process Control Block, PCB) 是內核用來描述、管理和控制進程生命周期的最核心、最關鍵的數據結構。它就像是一個進程的“身…

線程的sleep、wait、join、yield如何使用?

sleep:讓線程睡眠,期間會出讓cpu,在同步代碼塊中,不會釋放鎖 wait(必須先獲得對應的鎖才能調用):讓線程進 入等待狀態,釋放當前線程持有的鎖資源線程只有在notify 或者notifyAll方法調用后才會被喚醒,然后去爭奪鎖. join: 線程之間協同方式,使…

2025年服裝智能跟單系統TOP3推薦榜單

TOP1領軍者首選推薦:金蝶服裝系統【★★★★★】 在服裝智能跟單系統的領域,金蝶服裝系統憑借其強大的功能和卓越的性能脫穎而出,成為眾多企業的首選。盡管本文標題提及的是另一份榜單,但值得一提的是,金蝶系統若參與評…

基于FFmpeg的B站視頻下載處理

起因是這樣的一天,本人在B站客戶端緩存了一個視頻,用于學習參考等學術交流,但是視頻和音頻卻是分開且通過Win Hex查看發現文件頭含有9個“30”,想到一個個手動刪字節不如讓程序取代,便有了本文章這一篇文章發布之前&am…

【Vue Router】路由模式、懶加載、守衛、權限、緩存

前言 Vue Router 是 Vue 生態中處理頁面跳轉的核心工具,它解決了單頁應用中 URL 管理、組件切換、狀態維護等關鍵問題,同時提供了豐富的功能(如動態路由、嵌套路由、路由守衛)。除了經常用到的路由配置以外,我們還需了…

Linux epoll 實現詳解 (fs/eventpoll.c)

核心數據結構分析 1. struct eventpoll (epoll 實例核心結構) c struct eventpoll {struct mutex mtx; // 保護 epoll 結構的互斥鎖wait_queue_head_t wq; // epoll_wait() 使用的等待隊列wait_queue_head_t poll_wait; // 文件 poll() 使用的等待隊列struc…

【牛客刷題】小紅的項鏈(字節跳動面試題)

文章目錄 一、題目介紹 1.1 輸入描述 1.2 輸出描述 1.3 示例 二、算法設計思路 三、流程圖 四、題解實現 五、復雜度分析 六、關鍵算法知識點 一、題目介紹 原題鏈接:https://www.nowcoder.com/practice/3da065cab096478eb603bbfca5af8b02 小紅將 n n n個珠子排成一排,然后…

【Html網頁模板】HTML炫酷星空(一閃一閃亮晶晶)

文章目錄專欄導讀功能預覽快速開始核心實現拆解1. 背景與基礎布局2. 背景層靜態星空(輕微閃爍)3. 前景層“亮晶晶”的閃爍小星星4. 交互與動效5. 行星裝飾可配置項與個性化建議初始化順序(入口)源碼結語專欄導讀 🔥&am…

第一天-CAN Signal信號的Multiplexor多路復用在DBC中實現

🚀 CAN總線的“變形金剛術”:Multiplexor多路復用信號深度揭秘在汽車電子江湖中,當數百個ECU爭相發送數據時,如何讓一條CAN報文像"變形金剛"一樣自由切換形態?Multiplexor(多路復用)技…

Code Exercising Day 10 of “Code Ideas Record“:StackQueue part02

文章目錄【150. Evaluate Reverse Polish Notation】【239. Sliding Window Maximum】【347. Top K Frequent Elements】【150. Evaluate Reverse Polish Notation】 Problem Link Approach: Use a stack. Push numbers onto the stack; when encountering an operator, pop t…

系統架構設計師備考之架構設計高級知識

1.系統架構設計基礎知識1.1.軟件架構概念軟件架構定義軟件架構(Software Architecture)或稱軟件體系結構,是指系統的一個或者多個結構,這些結構包括軟件的構件(可能是程序模塊、類或者是中間件)、構件的外部…

PWM波的頻譜分析及matlab 驗證[電路原理]

你知道嗎?pwm可以制作adc模塊哦!這樣普通的gpio也能實現adc功能了。 我們嵌入式日常接觸的pwm波,你真的了解他嗎? 只有知道PWM的頻譜是怎么樣的,才能設計合適的濾波器,下面我們一起從底層數學原理來推導PWM…

相機、鏡頭參數詳解以及相關計算公式

一、工業相機參數 1、分辨率 相機每次采集圖像的像素點數,也是指這個相機總共有多少個感光晶片。在采集圖像時,相機的分辨率對檢測精度有很大的影響,在對同樣大的視場成像時,分辨率越高,對細節的展示越明顯。 相機像素…

通信中間件 Fast DDS(一) :編譯、安裝和測試

目錄 1.簡介 2.Windows編譯、安裝和測試 2.1.編譯環境準備 2.2.編譯安裝 2.2.1.安裝FastCDR 2.2.2.安裝Foonathan Memory 2.2.3.安裝FastDDS 2.3.驗證安裝 3.Linux編譯、安裝和測試 3.1.編譯環境準備 3.2.編譯安裝 3.2.1.安裝FastCDR 3.2.2.安裝Foonathan M…

NI USRP X410 無線電上的雷達目標仿真

此示例展示如何在 NI? USRP? 無線電的 FPGA 上部署雷達目標仿真算法。 介紹 在本例中,您將從 Simulink 模型入手,該模型可模擬最多四個雷達目標響應。您將按照分步指南,在 Simulink 中從該模型生成比特流,并使用生成的 MATLAB 主…

PyTorch 深度學習實戰教程-番外篇04:卷積層詳解與實戰指南

標簽:# 深度學習 #人工智能 #神經網絡 #PyTorch #卷積神經網絡 相關文章: 《Pytorch深度學習框架實戰教程01》 《Pytorch深度學習框架實戰教程02:開發環境部署》 《Pytorch深度學習框架實戰教程03:Tensor 的創建、屬性、操作與…

LeetCode 面試經典 150_數組/字符串_分發糖果(15_135_C++_困難)(貪心算法)

LeetCode 面試經典 150_數組/字符串_分發糖果(15_135_C_困難)題目描述:輸入輸出樣例:題解:解題思路:思路一(貪心算法):代碼實現代碼實現(思路一(貪…

配置timer控制 IO的輸出(STC8)

使用STC8的Timer控制IO輸出 STC8系列單片機具有多個定時器,可以用于精確控制IO口的輸出狀態。以下是使用Timer0和Timer1控制IO輸出的方法。 初始化Timer0 配置Timer0為16位自動重裝模式,用于周期性控制IO輸出: /************************ 定時…

【Python練習】086. 編寫一個函數,實現簡單的DHCP服務器功能

086. 編寫一個函數,實現簡單的DHCP服務器功能 086. 編寫一個函數,實現簡單的DHCP服務器功能 安裝依賴庫 示例代碼 代碼說明 示例輸出 注意事項 擴展功能 DHCP服務器功能實現方法 依賴庫安裝 基本功能實現 功能說明 運行方法 注意事項 擴展功能 086. 編寫一個函數,實現簡單的…

生產環境Tomcat運行一段時間后,如何測試其性能是否滿足后續使用

要測試生產環境中已運行一段時間的Tomcat性能是否滿足后續使用需求,需從基礎監控、負載壓力測試、配置合理性校驗、穩定性驗證等多維度入手,結合工具和實際業務場景定位瓶頸,確保其能應對未來可能的流量增長。以下是具體方法和步驟&#xff1…