Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python请求与PyCurl性能_Python_Performance_Benchmarking_Python Requests_Pycurl - Fatal编程技术网

Python请求与PyCurl性能

Python请求与PyCurl性能,python,performance,benchmarking,python-requests,pycurl,Python,Performance,Benchmarking,Python Requests,Pycurl,在性能方面,请求库与PyCurl相比如何 我的理解是,请求是urllib的python包装,而PyCurl是libcurl的python包装,它是本机的,因此PyCurl应该获得更好的性能,但不确定性能如何 我找不到任何比较基准。首先也是最重要的一点是,请求构建在的基础上,stdliburllib或urllib2库根本不被使用 在性能上比较请求和pycurl没有什么意义pycurl可以使用C代码进行工作,但与所有网络编程一样,您的执行速度在很大程度上取决于将机器与目标服务器分离的网络。此外,目标

在性能方面,请求库与PyCurl相比如何

我的理解是,请求是urllib的python包装,而PyCurl是libcurl的python包装,它是本机的,因此PyCurl应该获得更好的性能,但不确定性能如何


我找不到任何比较基准。

首先也是最重要的一点是,
请求
构建在的基础上,stdlib
urllib
urllib2
库根本不被使用

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

最后,
请求
有一个友好得多的API可供使用,您会发现使用更友好的API会更有效率。

,使用一个由gUnicorn/meinheld+nginx(用于性能和HTTPS)支持的小型Flask应用程序,看看完成10000个请求需要多长时间。测试在AWS中对一对卸载的c4.1大型实例运行,服务器实例没有CPU限制

TL;DR summary:如果你在做大量的网络工作,请使用PyCurl,否则请使用requests。PyCurl完成小请求的速度是请求的2-3倍,直到您遇到大请求的带宽限制(这里约为520 MBit或65 MB/s),并且使用的CPU功率减少了3到10倍。这些数字比较了连接池行为相同的情况;默认情况下,PyCurl使用连接池和DNS缓存,而请求不使用连接池和DNS缓存,因此一个简单的实现的速度将是原来的10倍

注意,由于涉及数量级,双对数图仅用于下图

  • 在重用连接时,pycurl发出请求大约需要73 CPU微秒
  • 请求在重用连接时发出请求大约需要526 CPU微秒
  • pycurl大约需要165 CPU微秒来打开新连接并发出请求(无连接重用),或者大约92微秒来打开
  • 请求需要大约1078CPU微秒才能打开新连接并发出请求(无连接重用),或者大约552微秒才能打开
,以及基准方法和系统配置

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

重点关注大小-

  • 在我的Mac Book Air上,有8GB的RAM和512GB的SSD,对于每秒3千字节(来自互联网和wifi)的100MB文件,pycurl、curl和requests library的get函数(无论分块还是流式处理)几乎是一样的

  • 在一个较小的4GB内存的本地主机上(来自同一个盒子上的Apache),对于1GB文件,curl和pycurl比“requests”库快2.5倍。对于请求,分块和流式处理一起提供10%的提升(分块大小超过50000)


  • 我原以为我将不得不交换pycurl的请求,但事实并非如此,因为我正在开发的应用程序的客户端和服务器不会那么紧密。

    似乎有一个新的孩子出现了:pycurl的请求接口

    谢谢你的基准-很好-我喜欢curl,它似乎比http做得更多


    我同意,对于大多数应用程序,请求的干净API最为重要;但是对于网络密集型应用程序,没有理由不使用pycurl。开销可能很重要(尤其是在数据中心内)。@BobMcGee:如果网络速度太高,开销也会很重要,那么你不应该再在整个应用程序中使用Python了。@Martijn_Pieters不同意——Python的性能并没有那么差,一般来说,将对性能敏感的位委托给本机库(pycurl就是一个很好的例子)是非常容易的。DropBox可以让它工作,而且百胜内部使用pycurl(因为它的很多工作只是网络抓取,需要尽可能快)。@BobMcGee:是的,对于像百胜这样的专业代码库来说,处理pycurl API的痛苦是值得的;然而,对于绝大多数URL处理需求而言,权衡的重点在于
    请求
    。换句话说,大多数项目不需要经历使用pycurl的痛苦;在我看来,在放弃
    请求
    API之前,您需要非常重视网络;开发的容易程度差别很大。@MarijnPieters:完全同意!除非网络性能至关重要(或者您需要低级别的curl功能),否则请求应该是默认的目标。为了完成这幅图,我们现在有了一个基准,有人可以用它来测试自己。你的基准很好,但是本地主机没有任何网络层开销。如果您可以在实际网络速度下限制数据传输速度,使用真实的响应大小(
    pong
    不现实),并包括混合内容编码模式(有压缩和无压缩),然后基于此生成计时,我还注意到,您将pycurl的设置移出了循环(设置URL和writedata目标应该是循环的一部分),并且不读取
    cStringIO
    缓冲区;非pycurl测试都必须以Python字符串对象的形式生成响应。@MartijnPieters缺少网络开销是故意的;这里的目的是单独测试客户机。URL在那里是可插入的,因此您可以使用r测试它