Python 在 3.11.4 之后请求模块性能

问题描述 投票:0回答:1

我遇到了请求模块的问题,在 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 次迭代的平均时间。

  • Python 3.11.4:2.2s
  • Python 3.11.5:19s
  • Python 3.12.3:18s

有人知道这里会发生什么吗?仅供参考,httpx 模块也会发生这种情况,但 urllib 模块不会发生这种情况。 urllib 的性能在各个版本中保持一致,而 httpx 模块的性能在 3.11.4 之后也有所下降。

python performance python-requests updating httpx
1个回答
0
投票

感谢您提供的信息和建议,尤其是分析。我分析了一个更复杂的版本,结果并不那么清晰。

当我分析这段代码时,主要瓶颈是这一部分:

      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.11.4 - 3.1s
  • Python 3.12.3 - 4.7s

请注意,实际时间取决于连接速度。重要的是,与不使用会话相比,我在 Python 3.12.3 上获得结果的速度快了多少。

© www.soinside.com 2019 - 2024. All rights reserved.