在前文基础上,好奇作为事务型数据库的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…