Python请求模块GET / POST +各种REST客户端的请求花费的时间超过curl

时间:2013-09-25 04:21:54

标签: python curl httprequest python-requests

基本上,我有一个网址,我想要获取一些XML数据。我无法透露的终点,但正在做:

curl -v "http://my-url.com/some/endpoint"

立即返回200 OK 和内容

使用Kenneth Reitz的请求模块,我有一个POST请求和一个GET请求,它们都需要30秒才能返回内容。

如果我这样使用它:

from timeit import Timer

t = Timer(lambda: requests.get(myurl).content)
print t.timeit(number=1)
30.2136261463

每次平均需要30.2秒。与我的POST请求相同。如果我不询问内容而只询问status_code响应,我会得到相同的情况,除非我通过 stream = True ,我快速得到响应,但不是内容。

我的困惑在curl命令中...我得到的响应和内容都在10ms以内。我尝试在我的python测试中伪造用户代理,尝试将大量参数传递给get()函数等。在curl和python-requests之间如何处理我不知道的请求之间必然存在一些主要区别。我是新手,所以如果我遗漏了一些明显的东西,我会道歉。

我还想提一下,我已经为此尝试了多台机器,多个版本的curl,python甚至尝试了一些REST客户端,如Postman等。只有curl快速执行闪电 - 在每种情况下命中相同的端点BTW。我知道其中一个选项是在我的测试中做一个子进程调用curl,但是......这是个好主意吗?

编辑: 我关心内容。我知道我可以快速获得响应代码(标题)。

提前致谢,

蒂霍米尔。

更新

我现在在我的测试中使用pycurl2,所以这只是一种解决方法,因为我希望我可以使用python-requests来处理所有事情。仍然好奇为什么卷曲这么快。

2 个答案:

答案 0 :(得分:3)

由于这个问题根本没有产生任何兴趣,我将接受我自己的解决方案 - 这涉及使用pycurl2而不是请求有问题的请求。

其中只有2个是慢的,这样做解决了我的问题,但这不是我希望的解决方案。

注意:我并没有以任何方式说请求是慢还是坏。这似乎是gzip压缩和GlassFish服务gzip数据与长度错误的问题。我只是想知道它为什么不影响curl / wget。

答案 1 :(得分:1)

要做的一件事就是使用:

requests.get(url, stream=False)

而不是你发布的内容。有关更多信息,请参阅此链接:

http://docs.python-requests.org/en/latest/user/advanced/

讨论

  • Curl是可执行文件
  • Python是一种解释型语言

因此,Python具有比curl慢得多的“启动”时间,尽管IO受CPU限制,但它的速度相对较慢。这是使用解释语言的权衡之一。但是,通常在执行速度相对较慢的情况下,开发和维护时间远远超过“损失”。 (注意:我说一般)。

正如你所说,一种可能的解决方案就是使用Python将curl包装在一个脚本中 - 这不是一个坏主意,但可能会导致灾难性的问题(取决于使用情况,比如删除文件),因为没有比赛需要考虑的条件。

另一种方法是尝试将原始Python代码分解为类似C / C ++的语言,这样您就可以编译它并获得您想要的等效性能。示例使用shedSkin和Cython。