2013-03-17 69 views
21

请求库如何与PyCurl性能相比较?Python请求与PyCurl性能

我的理解是Requests是urllib的python包装器,而PyCurl是libcurl的python包装器,它是本地的,所以PyCurl应该获得更好的性能,但不知道多少。

我找不到任何比较基准。

回答

52

I wrote you a full benchmark,使用gUnicorn支持一个简单的瓶应用/ meinheld + nginx的(性能和HTTPS),看到需要多长时间才能完成10,000个请求。 AWS在一对卸载的c4.large实例上运行测试,并且服务器实例不受CPU限制。

TL; DR摘要:如果您正在进行大量网络连接,请使用PyCurl,否则请使用请求。 PyCurl可以按照请求的速度快速完成2x-3x的请求,直到达到大请求的带宽限制(这里大约为520 MB或65 MB/s),并使用3x至10x的CPU功耗。这些数字比较了连接池行为相同的情况;默认情况下,PyCurl使用连接池和DNS缓存,而请求没有,所以一个天真的实现将会慢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微秒发出请求重用连接
  • 请求大约需要526 CPU微秒发出请求重用连接
  • pycurl大约需要165 CPU微秒至打开时,当新的连接和发出请求(无连接复用),或〜92微秒打开
  • 请求大约需要 CPU微秒至打开一个新的连接和发出请求(无连接复用),或〜 552微秒打开

Full results are in the link,以及基准方法和系统配置。

注意事项:虽然我不厌其烦地保证结果科学地收集,这只是一个测试系统类型和一个操作系统,性能有限的子集,尤其是HTTPS选项。

+2

你的基准很好,但是localhost没有任何网络层开销。如果您可以在实际的网络速度下限制数据传输速度,使用逼真的响应大小('乒乓'是不现实的),并且包括内容编码模式混合(有和没有压缩),然后*然后*生成基于那么,你就会拥有具有实际意义的基准数据。 – 2015-10-02 07:47:41

+0

我还注意到,你将pycurl的设置移出了循环(设置URL和writedata目标应该是循环的一部分),并且不要读出'cStringIO'缓冲区;非pycurl测试都必须以Python字符串对象的形式产生响应。 – 2015-10-02 07:52:22

+1

@MartijnPieters缺乏网络开销是故意的;这里的意图是单独测试客户端。该URL可以在那里插入,所以你可以根据你选择的真实的现场服务器来测试它(默认情况下它不会,因为我不想锤击某人的系统)。 **注意:** pycurl的后期测试通过​​body.getvalue读出响应体,性能非常相似。如果您可以提出改进建议,则欢迎PR代码。 – BobMcGee 2015-10-02 12:29:41

12

首先,requests构建在urllib3 library的顶部,stdlib urlliburllib2库根本不被使用。

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

最后,requests有一个更友好的API可供使用,并且您会发现使用这个友好的API可以提高工作效率。

+0

我同意对于大多数应用程序来说,请求的干净API最重要;但对于网络密集型应用程序,没有任何借口*不*使用pycurl。开销可能很重要(特别是在数据中心内)。 – BobMcGee 2015-10-02 03:06:40

+0

@BobMcGee:如果网络速度太高以至于开销会很重要,那么您就不应该再为整个应用程序使用Python了。 – 2015-10-02 07:46:15

+0

@Martijn_Pieters不同意 - python性能并不差,一般来说,将性能敏感的位委托给本地库是非常容易的(pycurl就是一个很好的例子)。 DropBox可以使它工作,而yum内部使用pycurl(因为它的许多工作只是网络提取,它需要尽可能快)。 – BobMcGee 2015-10-02 12:00:10

0

集中于大小 -

  1. 在我的Mac书航8GB的RAM和512GB固态硬盘,以3千字节第二进来一个100MB的文件(从互联网和WiFi),pycurl, curl和请求库的get函数(不管分块还是流)都几乎相同。

  2. 在一个较小的Quad core Intel Linux box与4GB的RAM,通过本地主机(从Apache在同一个盒子),对于1GB文件,curl和pycurl比'请求'库快2.5倍。对于请求分块和流式传输可以提高10%(大于50,000的块大小)。

我想我不得不换请求出去pycurl,但不能使我做不会有客户端和服务器关闭应用程序。