请求库如何与PyCurl性能相比较?Python请求与PyCurl性能
我的理解是Requests是urllib的python包装器,而PyCurl是libcurl的python包装器,它是本地的,所以PyCurl应该获得更好的性能,但不知道多少。
我找不到任何比较基准。
请求库如何与PyCurl性能相比较?Python请求与PyCurl性能
我的理解是Requests是urllib的python包装器,而PyCurl是libcurl的python包装器,它是本地的,所以PyCurl应该获得更好的性能,但不知道多少。
我找不到任何比较基准。
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倍。
Full results are in the link,以及基准方法和系统配置。
注意事项:虽然我不厌其烦地保证结果科学地收集,这只是一个测试系统类型和一个操作系统,性能有限的子集,尤其是HTTPS选项。
首先,requests
构建在urllib3
library的顶部,stdlib urllib
或urllib2
库根本不被使用。
在性能上比较requests
与pycurl
毫无意义。 pycurl
可能使用C代码进行工作,但与所有网络编程一样,执行速度在很大程度上取决于将您的机器与目标服务器分开的网络。而且,目标服务器的响应速度可能会很慢。
最后,requests
有一个更友好的API可供使用,并且您会发现使用这个友好的API可以提高工作效率。
我同意对于大多数应用程序来说,请求的干净API最重要;但对于网络密集型应用程序,没有任何借口*不*使用pycurl。开销可能很重要(特别是在数据中心内)。 – BobMcGee 2015-10-02 03:06:40
@BobMcGee:如果网络速度太高以至于开销会很重要,那么您就不应该再为整个应用程序使用Python了。 – 2015-10-02 07:46:15
@Martijn_Pieters不同意 - python性能并不差,一般来说,将性能敏感的位委托给本地库是非常容易的(pycurl就是一个很好的例子)。 DropBox可以使它工作,而yum内部使用pycurl(因为它的许多工作只是网络提取,它需要尽可能快)。 – BobMcGee 2015-10-02 12:00:10
集中于大小 -
在我的Mac书航8GB的RAM和512GB固态硬盘,以3千字节第二进来一个100MB的文件(从互联网和WiFi),pycurl, curl和请求库的get函数(不管分块还是流)都几乎相同。
在一个较小的Quad core Intel Linux box与4GB的RAM,通过本地主机(从Apache在同一个盒子),对于1GB文件,curl和pycurl比'请求'库快2.5倍。对于请求分块和流式传输可以提高10%(大于50,000的块大小)。
我想我不得不换请求出去pycurl,但不能使我做不会有客户端和服务器关闭应用程序。
你的基准很好,但是localhost没有任何网络层开销。如果您可以在实际的网络速度下限制数据传输速度,使用逼真的响应大小('乒乓'是不现实的),并且包括内容编码模式混合(有和没有压缩),然后*然后*生成基于那么,你就会拥有具有实际意义的基准数据。 – 2015-10-02 07:47:41
我还注意到,你将pycurl的设置移出了循环(设置URL和writedata目标应该是循环的一部分),并且不要读出'cStringIO'缓冲区;非pycurl测试都必须以Python字符串对象的形式产生响应。 – 2015-10-02 07:52:22
@MartijnPieters缺乏网络开销是故意的;这里的意图是单独测试客户端。该URL可以在那里插入,所以你可以根据你选择的真实的现场服务器来测试它(默认情况下它不会,因为我不想锤击某人的系统)。 **注意:** pycurl的后期测试通过body.getvalue读出响应体,性能非常相似。如果您可以提出改进建议,则欢迎PR代码。 – BobMcGee 2015-10-02 12:29:41