Python请求与PyCurl性能

Eug*_*ene 41 python performance benchmarking pycurl python-requests

请求库如何与PyCurl性能明智地进行比较?

我的理解是Requests是urllib的python包装器,而PyCurl是libcurl的python包装器,它是本机的,所以PyCurl应该会获得更好的性能,但不确定多少.

我找不到任何比较基准.

Bob*_*Gee 89

我给你写了一个完整的基准测试,使用了由gUnicorn/meinheld + nginx支持的简单Flask应用程序(用于性能和HTTPS),以及查看完成10,000个请求所需的时间.测试在AWS上的一对卸载的c4.large实例上运行,服务器实例不受CPU限制.

TL; DR摘要:如果您正在进行大量网络连接,请使用PyCurl,否则请使用请求.PyCurl以与请求一样快的速度完成2x-3x的小请求,直到您通过大请求达到带宽限制(此处约为520 MBit或65 MB/s),并且使用的CPU功率减少3x到10x.这些数字比较了连接池行为相同的情况; 默认情况下,PyCurl使用连接池和DNS缓存,其中请求没有,因此一个简单的实现将是10倍慢.

联合图表-RPS CPU时间按请求大小详细说明

只是HTTP吞吐量 只是HTTP RPS

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

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

链接中包含完整结果,以及基准测试方法和系统配置.

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

  • @MartijnPieters 缺乏网络开销是有意的;这里的目的是单独测试客户端。该 URL 是可插入的,因此您可以针对您选择的真实实时服务器对其进行测试(默认情况下不会,因为我不想破坏某人的系统)。**重点说明:** pycurl 后面的测试是通过 body.getvalue 读出响应体,性能非常相似。如果您可以提出改进建议,欢迎对代码进行 PR。 (3认同)
  • 您的基准测试很好,但localhost没有任何网络层开销.如果你可以限制实际网络速度的数据传输速度,使用真实的响应大小("乒乓"是不现实的),并包括混合的内容编码模式(有和没有压缩),然后*然后*产生基于的时间那么,你就拥有了具有实际意义的基准数据. (2认同)
  • @Martijn_Pieters 你可能想再看看,我已经更新了一个在 AWS 中具有完整网络开销的基准。 (2认同)

Mar*_*ers 17

首先,requests它建立在urllib3库的顶部,根本不使用stdlib urlliburllib2库.

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

最后,requests有一个更友好的API可供使用,你会发现使用这个更友好的API会更有效率.

  • 我同意对于大多数应用程序来说,请求的干净 API 最重要;但是对于网络密集型应用程序,没有理由*不*使用 pycurl。开销可能很重要(尤其是在数据中心内)。 (4认同)
  • @BobMcGee:如果网络速度如此之高以至于开销很重要,那么您不应该再将 Python 用于整个应用程序。 (3认同)
  • @Martijn_Pieters 不同意——python 的性能并没有那么糟糕,而且通常很容易将性能敏感位委托给本机库(pycurl 就是一个很好的例子)。DropBox 可以让它工作,而 yum 内部使用 pycurl(因为它的很多工作只是网络提取,需要尽可能快)。 (3认同)
  • @MarijnPieters:完全同意!除非网络性能至关重要(或者您需要低级 curl 功能),否则请求应该是默认的目标。为了完成那幅图,我们现在有一个基准,有人可以用它来测试自己。 (2认同)

use*_*263 8

似乎有一个新的东西出现了:- pycurl 的请求接口。

谢谢你的基准测试——这很好——我喜欢curl,它似乎能够做比http更多的事情。

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