我遇到了请求模块的问题,在 3.11.4 之后的 Python 版本中,Web 请求花费的时间明显更长。做了很多谷歌搜索,找不到任何与此直接相关的内容。
这里有一些要测试的代码。此代码的行为在我组织中的许多计算机上是一致的。所有这些测试都在 Windows 10 上运行,结果均来自 Python 版本 3.11.4、3.11.5 和 3.12.3 的同一台计算机。我为每个版本都使用 venv 创建了虚拟环境。
当我们从 3.11.4 升级到更新版本时,性能会下降。当我们卸载更新的内容并重新安装 3.11.4 时,性能就会恢复。
我正在运行的代码:
import requests
import datetime
starttime = datetime.datetime.now()
for i in range(10):
response = requests.get(f"https://google.com?param={i}")
data = response.text
endtime = datetime.datetime.now()
print(f"requests test elapsed - {(endtime - starttime).total_seconds()}s")
完成上述代码超过 10 次迭代的平均时间。
有人知道这里会发生什么吗?仅供参考,httpx 模块也会发生这种情况,但 urllib 模块不会发生这种情况。 urllib 的性能在各个版本中保持一致,而 httpx 模块的性能在 3.11.4 之后也有所下降。
感谢您提供的信息和建议,尤其是分析。我分析了一个更复杂的版本,结果并不那么清晰。
当我分析这段代码时,主要瓶颈是这一部分:
20 16.272 0.814 16.272 0.814 {method 'load_verify_locations' of '_ssl._SSLContext' objects}
这让我看到了这个页面,这似乎清楚地表明这是一个 openSSL 问题
就我而言,我可以更新我们的代码以利用上页中建议的会话。虽然速度不如 Python 3.11.4 中包含的 openSSL 版本那么快,但对于我的目的来说是可以接受的。
这是新代码:
import requests
import datetime
starttime = datetime.datetime.now()
session = requests.Session()
for i in range(10):
response = session.get(f"https://google.com?param={i}")
data = response.text
session.close()
endtime = datetime.datetime.now()
print(f"requests test elapsed - {(endtime - starttime).total_seconds()}s")
使用这段代码,结果是:
请注意,实际时间取决于连接速度。重要的是,与不使用会话相比,我在 Python 3.12.3 上获得结果的速度快了多少。