1

基本上,我有一个 url 来获取一些 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 命令......我在 10 毫秒内得到了响应和内容。我尝试在我的 python 测试中伪造用户代理,尝试将大量参数传递给 get() 函数等。 curl 和 python-requests 如何执行我不知道的请求之间肯定存在一些主要区别。我是新手,所以如果我遗漏了一些明显的东西,我深表歉意。

我还想提一下,我为此尝试了多台机器、多个版本的 curl、python,甚至尝试了一些 REST 客户端,如 Postman 等。只有 curl 执行得很快——顺便说一句,在每种情况下都达到相同的端点。我知道其中一个选项是在我的测试中进行子进程调用以 curl ,但是......这是个好主意吗?

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

提前致谢,

提霍米尔。

更新:

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

4

2 回答 2

4

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

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

注意:我并不是说请求很慢或很糟糕。这似乎是 gzip 压缩和 GlassFish 提供的 gzip 压缩数据的问题,其长度有问题。我只是想知道为什么它不影响 curl/wget。

于 2013-10-04T05:03:05.050 回答
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。

于 2013-09-25T04:29:26.613 回答