You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将SQLite3表数据加载为列表字典?附内存占用疑问

SQLite数据转字典列表(dict of lists)的实现与内存分析

一、快速实现字典列表的方法

方法1:原生SQLite一步转换

直接利用游标描述信息和查询结果转置,不需要先生成列表式字典,效率最高:

import sqlite3

conn = sqlite3.connect(folder_path + 'my_db.db')
cur = conn.cursor()
cur.execute('SELECT * FROM my_table')

# 提取所有字段名
columns = [col[0] for col in cur.description]
# 获取所有行数据并转置,将字段与对应列数据绑定
rows = cur.fetchall()
dict_of_lists = dict(zip(columns, zip(*rows)))

# 可选:将元组转为列表(元组本身可遍历,按需选择)
dict_of_lists = {k: list(v) for k, v in dict_of_lists.items()}

cur.close()
conn.close()

方法2:从已有列表式字典转换

如果已经生成了list_of_dicts,可以用字典推导式快速转换:

# 确保列表非空再执行
if list_of_dicts:
    dict_of_lists = {
        key: [item[key] for item in list_of_dicts]
        for key in list_of_dicts[0].keys()
    }

方法3:用Pandas简化操作(适合大数据量)

如果项目已经依赖Pandas,一行代码就能完成转换:

import pandas as pd
import sqlite3

conn = sqlite3.connect(folder_path + 'my_db.db')
dict_of_lists = pd.read_sql_query('SELECT * FROM my_table', conn).to_dict('list')
conn.close()

二、两种结构的内存占用对比

你的判断是对的,字典列表在数据行数较多时,内存占用确实比列表式字典更低,原因如下:

  • 列表式字典中,每一行数据都是独立的字典,每个字典都会重复存储所有键的字符串对象。Python的小字符串虽有 intern 优化,但这是针对字符串本身的,无法消除字典间键的重复存储开销,数据量越大,冗余越明显。
  • 字典列表中,每个字段名(键)只存储一次,对应的值是连续的列表,内存布局更紧凑,完全没有键的冗余存储。

实际测试中,当数据量达到上万条时,列表式字典的内存占用通常是字典列表的2-5倍(具体倍数取决于字段数量)。


内容的提问来源于stack exchange,提问作者SapereAude

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 03:49:55