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

Flask中加速json.dumps的最佳实践?大数据API返回慢求优化

Flask API返回大数据JSON的性能优化最佳实践

针对你提到的5万行数据序列化返回耗时过高的场景,以下是Flask端可落地的优化方案:

1. 替换JSON序列化库,提升核心序列化速度

标准库json.dumps在大数据量场景下性能一般,建议改用ujson或orjson这类高性能JSON库,它们的序列化速度比标准库快2-5倍:

  • 安装ujson:pip install ujson
  • 替换原返回代码:
    import ujson
    from flask import Response
    
    return Response(ujson.dumps(data, default=str), mimetype='application/json')
    
    注:orjson性能更优,但需注意它的类型兼容规则,比如datetime类型需手动转换或通过default参数适配。

2. 分块序列化+流式响应,降低内存占用与传输延迟

不要一次性把所有数据序列化到内存再返回,采用流式响应边序列化边输出数据:

import ujson
from flask import Response

def stream_json(data):
    yield '['
    first_row = True
    for row in data:
        if not first_row:
            yield ','
        yield ujson.dumps(row, default=str)
        first_row = False
    yield ']'

return Response(stream_json(data), mimetype='application/json')

这种方式既能降低Flask应用的内存峰值,还能让前端更早开始接收数据,减少整体等待时间。

3. 启用Gzip压缩,大幅削减传输体积

大数据JSON的压缩率通常能达到80%以上,启用Gzip后传输时间会显著减少:

  • 安装flask-compress扩展:pip install flask-compress
  • 在Flask应用中配置:
    from flask import Flask
    from flask_compress import Compress
    
    app = Flask(__name__)
    Compress(app)
    # 仅对大于1KB的响应触发压缩
    app.config['COMPRESS_MIN_SIZE'] = 1024
    

4. 优化数据库查询结果格式,减少转换开销

  • 使用字典游标直接获取字典格式的查询结果,避免手动转换步骤,比如MySQL驱动中设置:
    cursor = connection.cursor(dictionary=True)
    
  • 采用服务器端游标(SSCursor),避免一次性将所有查询结果加载到内存,配合流式响应逐步获取数据:
    from mysql.connector.cursor import SSCursor
    
    cursor = connection.cursor(cursor_class=SSCursor)
    cursor.execute(query)
    # 逐行处理数据并加入流
    for row in cursor:
        pass  # 配合流式序列化逻辑处理
    

5. 精简返回字段,减少序列化数据量

如果前端不需要所有字段,在SQL查询时只选择必要的列,直接从源头减少需要序列化的数据量,这对大数据场景的性能提升非常明显。

6. 内存与架构优化补充

  • 确保Flask应用有足够内存资源,当前2GB内存处理5万行数据基本足够,但如果数据结构冗余(比如嵌套层级过多),可改用更轻量的存储结构(如列表的列表代替列表的字典)。
  • 若长期需要处理超大流量或超大数据量,可考虑替换为FastAPI,它的原生序列化和响应处理性能比Flask更优,且支持异步请求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 00:42:29