Python SQL查询结果格式化代码性能优化问询
提升Python处理SQL查询结果转JSON的性能
你现在的代码处理速度在11万行/秒,确实还有不少优化空间——主要瓶颈在纯Python层面的循环赋值和OrderedDict的创建开销上。下面给你几个实际可行的优化方案,按性能提升幅度排序:
1. 用列表推导+zip代替手动循环(最快的纯Python方案)
原代码里手动维护索引i、逐字段赋值给OrderedDict的操作,是纯Python级别的循环,速度很慢。换成zip(底层C实现)配合列表推导,能直接把行数据和列名映射成字典,效率提升非常明显。
另外,Python 3.7+的普通dict已经默认保持插入顺序了,完全不需要collections.OrderedDict,能省掉不少对象创建的开销。
优化后的核心代码:
SQLquery = "SELECT value2 FROM mytable" # 用with语句自动管理游标,不用手动close with connection.cursor() as cursor: cursor.execute(SQLquery) if cursor.description: column_names = [col[0] for col in cursor.description] Time1 = datetime.datetime.now() # 直接迭代游标(不用fetchall,节省内存+减少一次数据拷贝) data = [dict(zip(column_names, row)) for row in cursor] Time2 = datetime.datetime.now() print(f"处理行数:{len(data)},耗时:{Time2 - Time1}") connection.commit()
如果你的Python版本低于3.7,还是需要OrderedDict,改成这样即可:
import collections data = [collections.OrderedDict(zip(column_names, row)) for row in cursor]
针对单列查询的额外优化
如果是像你例子里的单列查询,还能再简化,跳过zip的开销:
column_name = column_names[0] data = [{column_name: row[0]} for row in cursor]
2. 用Pandas处理(大数据量首选)
如果允许引入第三方库,Pandas是处理这类批量数据转换的神器——它的底层用C扩展实现,处理速度能轻松突破百万行/秒,代码也更简洁。
示例代码:
import pandas as pd SQLquery = "SELECT time_bucket('30 minutes', datetime) AS thirty_min, AVG(value3) AS value3 FROM mytable WHERE datetime > '2019-1-1 12:0:0.00' AND datetime < '2019-1-12 12:0:0.00' GROUP BY thirty_min ORDER BY thirty_min;" Time1 = datetime.datetime.now() # 直接从数据库读取成DataFrame df = pd.read_sql_query(SQLquery, connection) # 转成字典列表(和你要的格式一致) data = df.to_dict('records') Time2 = datetime.datetime.now() print(f"处理行数:{len(data)},耗时:{Time2 - Time1}")
3. 避免一次性fetchall
原代码里的cursor.fetchall()会把所有查询结果一次性加载到内存,当数据量很大时,不仅内存占用高,还会增加一次数据拷贝的开销。直接迭代游标(for row in cursor)是逐行从数据库获取数据,内存更友好,速度也更快。
性能对比参考
- 原代码:~11万行/秒
- 纯Python优化方案(列表推导+zip):~50-80万行/秒
- Pandas方案:~150-300万行/秒(取决于数据类型和硬件)
最后提个小建议:原代码里的try-except捕获Exception后直接pass,这会隐藏错误信息,建议至少打印异常详情,方便排查问题。
内容的提问来源于stack exchange,提问作者tomatoeshift
相关产品推荐
相关产品推荐

