56

Requests 库与 PyCurl 的性能相比如何?

我的理解是 Requests 是 urllib 的 python 包装器,而 PyCurl 是原生 libcurl 的 python 包装器,所以 PyCurl 应该获得更好的性能,但不确定多少。

我找不到任何比较基准。

4

4 回答 4

125

我为你写了一个完整的基准测试,使用由 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 倍。

组合图-RPS CPU 时间按请求大小详细

只是 HTTP 吞吐量 只是 HTTP RPS

请注意,由于涉及的数量级,双对数图仅用于下图 HTTP & HTTPS 吞吐量 HTTP & HTTPS RPS

  • pycurl 在重用连接时需要大约 73 CPU 微秒来发出请求
  • requests在重用连接时发出请求大约需要526 CPU 微秒
  • pycurl 大约需要 165 CPU 微秒来打开一个新连接并发出请求(没有连接重用),或者大约 92 微秒来打开
  • requests 大约需要1078 CPU 微秒来打开一个新连接并发出请求(没有连接重用),或者大约 552 微秒来打开

完整结果在链接中,以及基准方法和系统配置。

警告:虽然我努力确保以科学的方式收集结果,但它只测试一种系统类型和一种操作系统,以及有限的性能子集,尤其是 HTTPS 选项。

于 2015-10-02T03:01:31.927 回答
21

首先也是最重要的,它是建立在requests之上的,stdlib或库根本不被使用。urllib3urlliburllib2

requestspycurl性能相比没有什么意义。pycurl可能会使用 C 代码进行工作,但与所有网络编程一样,您的执行速度很大程度上取决于将您的机器与目标服务器分开的网络。此外,目标服务器可能响应缓慢。

最后,requests使用更友好的 API,您会发现使用更友好的 API 会提高工作效率。

于 2013-03-17T14:59:57.353 回答
4

似乎有一个新的孩子: - pycurl 的请求接口。

谢谢你的基准 - 很好 - 我喜欢 curl,它似乎能够做的比 http 多一点。

https://github.com/dcoles/pycurl-requests

于 2020-04-06T20:11:11.923 回答
2

专注于尺寸 -

  1. 在我的带有 8GB RAM 和 512GB SSD 的 Mac Book Air 上,对于以每秒 3 KB 的速度传入的 100MB 文件(来自互联网和 wifi),pycurl、curl 和请求库的 get 函数(无论是分块还是流式传输)都是基本上一样。

  2. 在具有 4GB RAM 的较小四核 Intel Linux机器上,通过 localhost(来自同一机器上的 Apache),对于 1GB 文件,curl 和 pycurl 比“请求”库快 2.5 倍。对于请求,分块和流式传输一起提供 10% 的提升(块大小超过 50,000)。

我以为我将不得不为 pycurl 交换请求,但不是这样,因为我正在制作的应用程序不会让客户端和服务器关闭。

于 2017-07-30T01:59:05.990 回答