咨询python-requests两种请求时间测量方法差异巨大的原因
为什么
time.time()和r.elapsed的耗时差这么多? 这俩值差这么大,核心原因是它们测量的完全不是同一个阶段的耗时!咱们一步步拆解清楚:
1. time.time() - start:你感知到的「完整总耗时」
这个值是从你代码执行start = time.time()开始,到end = time.time()结束的全部时间,包含了requests.get()执行过程中所有环节的耗时:
- DNS域名解析(把网址转成服务器IP的过程)
- 和目标服务器建立TCP连接(包括三次握手、SSL加密握手,如果是HTTPS的话)
- 等待服务器处理你的请求、准备响应
- 把响应内容完整下载到本地
- 甚至requests库内部的一些初始化、数据处理小步骤
你在Chrome里看到的实际耗时,就和这个值对应——浏览器显示的页面加载时间,也是从发起请求开始,到所有资源加载完成的完整时间,逻辑完全一致。
2. r.elapsed:服务器处理请求的「核心耗时」
requests库的r.elapsed属性,只记录从HTTP请求正式发送给服务器,到完整接收响应内容的时间,它完全不包含DNS解析、TCP连接建立这些前置环节的耗时。
在你的案例里,0.63秒是服务器实际处理请求并返回响应的速度,剩下的64秒左右,全花在了DNS解析、建立连接这些“准备工作”上(大概率是你的网络环境里DNS解析很慢,或者连接目标服务器时等待时间过长)。
怎么验证这个结论?
你可以用细粒度计时拆分各个阶段,看看哪部分拖了后腿:
import requests import time import socket # 单独测DNS解析时间 start_dns = time.time() socket.gethostbyname("www.dl.soc.i.kyoto-u.ac.jp") end_dns = time.time() print(f"DNS解析耗时: {end_dns - start_dns:.2f}秒") # 测完整请求的总耗时 start_total = time.time() r = requests.get("https://www.dl.soc.i.kyoto-u.ac.jp/index.php/members/") end_total = time.time() print(f"总耗时: {end_total - start_total:.2f}秒") print(f"服务器处理核心耗时(elapsed): {r.elapsed.total_seconds():.2f}秒")
运行后你会发现,DNS解析的时间加上r.elapsed的时间,基本和总耗时接近,就能实锤是前置环节拖了后腿。
想要和Chrome一致的总耗时?
继续用time.time()(或者更精确的time.perf_counter())包裹整个请求过程就好,这就是最贴近你实际感知的完整耗时。
内容的提问来源于stack exchange,提问作者AnxietyMonger
相关产品推荐
相关产品推荐

