如何将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
相关产品推荐
相关产品推荐

