【问题标题】:Python requests module GET/POST + various REST clients' requests taking longer than curlPython 请求模块 GET/POST + 各种 REST 客户端的请求比 curl 花费的时间更长
【发布时间】:2013-09-25 04:21:54
【问题描述】:

基本上,我有一个 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,我会快速得到响应,但不能得到内容。 p>

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

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

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

提前致谢,

提霍米尔。

更新:

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

【问题讨论】:

  • python requests is slow 的可能重复项
  • 上述线程的解决方案满足 OP,因为他们不关心内容。我需要内容,就我而言,这很慢。

标签: python curl httprequest python-requests


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    要做的一件事是使用:

    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。

    【讨论】:

    • 嗯.. 我真的不认为这与 curl 作为二进制文件和在这种情况下被解释的 python 有任何关系,因为差异是 30 秒:D。更有可能是我正在访问的服务有问题,或者 curl 做了其他提到的服务都没有做的事情。但感谢您的输入。我一直试图弄清楚这一点。请注意,从 python 解释器调用 curl 命令也会快速执行并且我得到内容。与我之前读过的相比,Python 并没有那么慢。
    • @TihomirSaulic,在某种程度上。根据使用情况,差异可能高达数量级。但是,一般来说,问题在于 OP 如何请求流信息。
    • 我试过 requests.head(url, allow_redirects=False) 并得到空内容:( ..如果我不请求内容(这对头部请求有意义?)然后我很快就会得到响应,但我在乎关于内容...不知道如何处理这个!P.S.我是 OP :D
    • @TihomirSaulic。已编辑,再试一次。
    • 据我了解,stream=False 是默认值,stream=True 使您可以根据内容的属性执行条件操作。就像 abort if it is too long etc. 无论如何, stream=False 没有帮助,而 stream=True 只能让我立即得到响应,仅此而已。感谢您的帮助,稍后我将继续深入研究。
    猜你喜欢
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-07
    • 2017-02-05
    相关资源
    最近更新 更多