Python请求与PyCurl性能

时间:2013-03-17 14:41:26

标签: python performance benchmarking python-requests pycurl

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

我的理解是Requests是urllib的python包装器,而PyCurl是libcurl的python包装器,它是原生的,因此PyCurl应该会获得更好的性能,但不确定多少。

我找不到任何比较基准。

4 个答案:

答案 0 :(得分:80)

I wrote you a full benchmark ,使用由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倍慢。

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-microseconds 才能在重用连接时发出请求
  • pycurl需要大约165微秒 - 打开一个新连接并发出请求(没有连接重用),或者打开大约92微秒
  • 请求需要 1078 CPU-microseconds才能打开新连接并发出请求(无连接重用),或者打开约552微秒

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

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

答案 1 :(得分:16)

首先,requests建立在urllib3 library之上,根本不使用stdlib urlliburllib2库。

requestspycurl的效果进行比较几乎没有意义。 pycurl可能使用C代码进行工作,但与所有网络编程一样,您的执行速度在很大程度上取决于将您的计算机与目标服务器分开的网络。此外,目标服务器可能响应缓慢。

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

答案 2 :(得分:2)

似乎有一个新来的家伙:-请求pycurl的接口。

谢谢您的基准测试-很好-我喜欢curl,它似乎比http还能做更多的事情。

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

答案 3 :(得分:1)

专注于尺寸 -

  1. 在我的Mac Book Air上配备8GB内存和512GB SSD,一个100MB文件,每秒3千字节(来自互联网和wifi),pycurl,curl和请求库获取功能(无论如何)分块或流媒体)几乎相同。

  2. 在较小的Quad core Intel Linux box上有4GB RAM,在localhost上(来自同一盒子上的Apache),对于1GB文件,curl和pycurl比'requests'库快2.5倍。对于请求分块和流媒体一起提供10%的提升(块大小超过50,000)。

  3. 我以为我不得不为pycurl交换请求,但不是因为我正在制作的应用程序不会让客户端和服务器关闭。