如何在Python中提升请求速度?币安API低延迟优化咨询
代码优化建议与C++重写必要性分析
现有代码的隐藏优化点
针对requests代码段的优化
- 连接复用:当前代码每次请求都会新建TCP/TLS连接,握手开销占延迟很大比例。改用
requests.Session()复用连接池,避免重复握手:session = requests.Session() # 配置连接池与TLS 1.3 ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) ctx.min_version = ssl.TLSVersion.TLSv1_3 adapter = requests.adapters.HTTPAdapter(pool_connections=10, pool_maxsize=10) session.mount('https://', adapter) # 发起请求 response = session.post(url, headers=headers, json=request_data) response = response.json()['data'] - 简化JSON解析:直接用
response.json()替代json.loads(response.text),减少一次字节到字符串的转换开销,requests内部会直接从响应字节流解析JSON。
针对http.client代码段的优化
- 连接复用:不要每次请求新建
HTTPSConnection,复用同一个连接对象(需处理连接断开后的重连逻辑):# 初始化一次连接,配置TLS 1.3 ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) ctx.min_version = ssl.TLSVersion.TLSv1_3 conn = http.client.HTTPSConnection(host, context=ctx) conn.set_alive_timeout(30) # 设置长连接超时 # 多次请求复用该连接 conn.request("POST", endpoint, payload, headers) res = conn.getresponse() data = json.loads(res.read()) - 避免冗余解码:
res.read()返回的字节流可直接传入json.loads,无需先转成UTF-8字符串,减少一次转换开销。
通用优化措施
- DNS缓存:Python默认DNS缓存时间极短,可手动缓存解析后的IP地址,避免每次请求触发DNS查询:
import socket # 提前解析并缓存IP cached_ip = socket.gethostbyname(host) # http.client直接用缓存IP,需手动添加Host头 conn = http.client.HTTPSConnection(cached_ip, context=ctx) headers['Host'] = host - 减少序列化开销:如果
request_data已提前序列化为JSON字符串,直接用data参数(requests)或传入序列化后的payload(http.client),避免重复执行json.dumps。 - 系统TCP调优:在AWS东京节点启用TCP Fast Open、调整TCP窗口大小等参数,减少网络传输延迟(如执行
sysctl -w net.ipv4.tcp_fastopen=3)。
是否需要改用C++重写?
- 优先完成Python代码优化:绝大多数场景下,延迟瓶颈来自网络握手、传输而非Python的CPU执行效率。完成上述优化(尤其是连接复用、TLS 1.3、DNS缓存)后,延迟会有明显下降,通常能满足币安API的低延迟需求。
- C++重写的适用场景:如果请求频率极高(每秒数百次以上),且Python的GIL或IO模型成为性能瓶颈,此时C++结合libcurl等高性能HTTP库能进一步压缩延迟,但重写成本高,需权衡开发维护代价。
- 折中方案:若Python优化后仍不达标,可尝试用
pycurl(libcurl的Python绑定)替代原生HTTP库,它比requests/http.client性能更高,同时保留Python的开发效率。
内容的提问来源于stack exchange,提问作者Арт
相关产品推荐
相关产品推荐

