Python从URL下载CSV并快速转换为JSON的最优实现方案咨询
性能瓶颈分析
你当前的代码主要有三个层面的性能问题:
- 网络IO层面:
requests.get默认会把整个响应的字节全部加载到内存才会返回,大文件场景下内存开销高,等待时间长 - 数据处理层面:先把全量字节解码为字符串、再用
StringIO包装、再全量转成列表传给json.dumps,中间产生了多份全量冗余数据,内存峰值高,串行处理效率低 - 模块性能层面:标准库的
csv模块是纯Python实现,json模块序列化速度也一般,大文件下处理效率偏低
优化方案
无第三方依赖的优化方案
不需要额外安装库,修改现有逻辑就能获得明显提速:
import requests import csv import json import codecs URL = "你的目标CSV地址" # 开启流模式边下载边处理,添加超时避免无意义等待 with requests.get(URL, stream=True, timeout=30) as resp: resp.raise_for_status() # 跳过全量解码步骤,直接流式解码后传给DictReader处理 reader = csv.DictReader(codecs.iterdecode(resp.raw, 'utf-8')) # 如果是直接输出到文件,可以逐行写入JSON连列表都不需要,内存开销更低 rows = [row for row in reader] json_data = json.dumps(rows)
这个方案相比原代码,内存峰值可以降低一半以上,大文件下速度提升30%左右。
高性能方案(推荐,大文件场景提速5~10倍)
用编译型高性能库替换标准库组件,是目前速度最快的实现方式:
- 用
polars替换标准库csv做CSV解析:底层是多线程Rust实现,解析速度远快于纯Python的csv模块,支持直接从URL读取CSV,自动处理流式下载 - 用
orjson替换标准库json做序列化:序列化速度是标准库的3~5倍,内存开销更低
实现代码:
import polars as pl import orjson URL = "你的目标CSV地址" # 直接从URL读CSV,底层自动处理下载、解析,不需要手动处理网络请求 df = pl.read_csv(URL) # 序列化输出,也可以直接用df.write_json("output.json")直接写入文件,速度更快 json_data = orjson.dumps(df.to_dicts())
如果不需要用到DataFrame的其他能力,也可以用fastcsv这个轻量的C实现CSV解析库,比polars更轻量,速度也远快于标准库csv。
额外提速技巧
- 如果CSV有不需要的字段,可以在
read_csv的时候指定columns参数只读取需要的列,减少处理的数据量 - 如果服务器支持HTTP压缩,requests和polars都会自动处理,不需要额外配置,能大幅减少网络传输时间
- 如果需要同时处理多个CSV文件,可以用异步HTTP客户端
httpx替换requests,并发下载能进一步提升总速度
内容的提问来源于stack exchange,提问作者patryk_ostrowski
相关产品推荐
相关产品推荐

