Python Requests与PyCurl性能对比

60 投票
4 回答
39931 浏览
提问于 2025-04-17 19:24

Requests库和PyCurl在性能上有什么区别呢?

我的理解是,Requests是对urllib的一个Python封装,而PyCurl是对libcurl的一个Python封装,后者是原生的,所以PyCurl的性能应该更好,但具体好多少我不太确定。

我找不到任何比较的基准测试数据。

4 个回答

8

看起来有个新玩意儿出现了:- pycurl的requests接口。

谢谢你提供的基准测试 - 很不错 - 我喜欢curl,它似乎能做的事情比http多一些。

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

21

首先,requests 是建立在 urllib3 之上的,根本没有使用标准库中的 urlliburllib2 库。

requestspycurl 在性能上进行比较其实没什么意义。虽然 pycurl 可能用到了 C 语言的代码,但就像所有网络编程一样,你的执行速度主要取决于你电脑和目标服务器之间的网络情况。而且,目标服务器的响应速度也可能很慢。

总的来说,requests 提供了一个更友好的接口来使用,你会发现用这个更友好的接口工作时效率更高。

138

我为你写了一个完整的性能测试,使用了一个简单的Flask应用程序,后端是gUnicorn/meinheld和nginx(为了提高性能和支持HTTPS),测试了完成10,000个请求需要多长时间。测试是在AWS上进行的,使用了一对没有负载的c4.large实例,服务器实例没有受到CPU限制。

总结:如果你需要处理很多网络请求,建议使用PyCurl;否则可以用requests。PyCurl在处理小请求时速度是requests的2到3倍,直到你遇到大请求的带宽限制(这里大约是520 MBit或65 MB/s),而且它的CPU使用率比requests低3到10倍。这些数据是在连接池行为相同的情况下比较的;默认情况下,PyCurl使用连接池和DNS缓存,而requests则不使用,所以如果简单实现的话,requests会慢10倍。

Combined-chart-RPS CPU Time by request size detailed

Just HTTP throughput Just HTTP RPS

注意:下面的图表使用了双对数坐标,仅因涉及的数量级 HTTP & HTTPS throughput HTTP & HTTPS RPS

  • 使用pycurl重用连接时,发出请求大约需要73微秒的CPU时间
  • 使用requests重用连接时,发出请求大约需要526微秒的CPU时间
  • 使用pycurl发起新连接并发出请求(不重用连接)大约需要165微秒的CPU时间,打开连接大约需要92微秒
  • 使用requests发起新连接并发出请求(不重用连接)大约需要1078微秒的CPU时间,打开连接大约需要552微秒

完整结果请查看链接,里面有性能测试的方法和系统配置。

注意事项:虽然我尽力确保结果是以科学的方式收集的,但这只是测试了一种系统类型和一种操作系统,以及有限的性能和特别是HTTPS选项。

撰写回答