【发布时间】:2021-08-26 07:27:54
【问题描述】:
Requests 库与 PyCurl 的性能相比如何?
我的理解是 Requests 是 urllib 的 python 包装器,而 PyCurl 是原生 libcurl 的 python 包装器,所以 PyCurl 应该会获得更好的性能,但不确定能提高多少。
我找不到任何比较基准。
【问题讨论】:
标签: python performance benchmarking python-requests pycurl
Requests 库与 PyCurl 的性能相比如何?
我的理解是 Requests 是 urllib 的 python 包装器,而 PyCurl 是原生 libcurl 的 python 包装器,所以 PyCurl 应该会获得更好的性能,但不确定能提高多少。
我找不到任何比较基准。
【问题讨论】:
标签: python performance benchmarking python-requests pycurl
首先,requests 构建在 urllib3 library 之上,根本不使用 stdlib urllib 或 urllib2 库。
在性能上比较 requests 和 pycurl 没有什么意义。 pycurl 可能使用 C 代码进行工作,但与所有网络编程一样,您的执行速度很大程度上取决于将您的机器与目标服务器分开的网络。此外,目标服务器可能响应缓慢。
最后,requests 有一个更友好的 API 可供使用,您会发现使用该更友好的 API 会提高工作效率。
【讨论】:
requests。换句话说,大多数项目都不需要经历使用pycurl的痛苦;在我的观点中,您需要非常依赖网络,然后才值得放弃requests API;易于开发的差异是巨大的。
I wrote you a full benchmark,使用由 gUnicorn/meinheld + nginx 支持的简单 Flask 应用程序(用于性能和 HTTPS),并查看完成 10,000 个请求需要多长时间。测试在 AWS 中在一对未加载的 c4.large 实例上运行,并且服务器实例不受 CPU 限制。
TL;DR 总结:如果您要进行大量网络连接,请使用 PyCurl,否则使用请求。 PyCurl 完成小请求的速度是请求的 2 到 3 倍,直到您达到大请求的带宽限制(此处约为 520 MBit 或 65 MB/s),并且使用的 CPU 功率减少了 3 倍到 10 倍。这些图比较了连接池行为相同的情况;默认情况下,PyCurl 使用连接池和 DNS 缓存,而请求则不使用,因此简单的实现将慢 10 倍。
Full results are in the link,以及基准测试方法和系统配置。
警告:虽然我努力确保以科学的方式收集结果,但它只测试一种系统类型和一种操作系统,以及有限的性能子集,尤其是 HTTPS 选项.
【讨论】:
pong 不现实),并包括混合内容编码模式(有和没有压缩),那么 在此基础上生成时间,然后您将获得具有实际意义的基准数据。
cStringIO 缓冲区;非 pycurl 测试都必须将响应生成为 Python 字符串对象。
关注大小 -
在配备 8GB RAM 和 512GB SSD 的 Mac Book Air 上,100MB 文件以每秒 3 KB 的速度传入(来自互联网和 wifi)、pycurl、curl 和 requests 库的 get 函数(无论分块或流式传输)几乎相同。
在具有 4GB RAM 的较小 Quad core Intel Linux box 上,通过 localhost(来自同一机器上的 Apache),对于 1GB 文件,curl 和 pycurl 比“请求”库快 2.5 倍。对于请求,分块和流式传输一起提供 10% 的提升(块大小超过 50,000)。
我以为我必须将请求换成 pycurl,但不是这样,因为我正在制作的应用程序不会让客户端和服务器关闭。
【讨论】:
似乎有一个新的孩子:- pycurl 的请求接口。
感谢您的基准测试 - 很好 - 我喜欢 curl,它似乎比 http 能做的更多。
【讨论】: