循环调用requests.post耗时久CPU占用过高如何优化
性能优化方案
当前代码采用串行同步方式逐次发送post请求,IO等待时间占比极高,同时存在变量不规范、资源未合理释放的问题,可从以下维度优化:
- 修复基础语法问题
现有代码存在变量大小写不匹配问题:定义的请求体变量为Data,实际传入post方法的参数为data,同时如果datalist、account为固定键名,需要添加引号避免变量未定义报错,先修正语法问题再做性能优化。 - 优先使用接口批量查询能力
先确认目标POST接口是否支持传入多组queryValue批量返回结果,若支持直接将多份查询参数合并为单次请求发送,可直接消除90%以上的请求开销,是优化效果最明显的方案。 - 改用异步并发请求替代串行请求
如果接口不支持批量查询,把同步请求库requests替换为异步请求库aiohttp,同时根据接口限流规则设置合理的并发数,将原本串行的IO等待改为并行,耗时可直接降低至原有的1/10~1/50(根据并发数调整)。
同步场景下也可以用requests.Session()复用TCP连接,减少多次握手的开销,示例代码:import requests from requests_negotiate import HTTPSPNEGOAuth session = requests.Session() session.auth = HTTPSPNEGOAuth() result = [] for i in list: data = {"queryValue": i["columnA"]} resp = session.post(url, json=data) resp.raise_for_status() columnB = resp.json()["datalist"]["account"] result.append(columnB) - 降低内存占用
10-20G的内存占用通常是因为全量加载了超大的list数据源、或者所有请求响应结果都缓存在内存没有释放导致的,可采用分批次处理的方式:每次只加载1000~10000条数据到内存,处理完这批后再加载下一批,处理过程中不要留存不需要的响应原始内容,只保留需要的ColumnB字段即可。
内容的提问来源于stack exchange,提问作者Ananya Gupta
相关产品推荐
相关产品推荐

